函数称为c宏的参数

Function call as argument to C macro

本文关键字:参数 函数      更新时间:2023-10-16

首先一个小代码:

int counter = 0;
int get_counter() { return counter++; }
#define EVEN_OR_ZERO(cc) ( (cc) % 2 == 0 ? (cc) : 0 )
int next_even_or_zero = EVEN_OR_ZERO(get_counter());

此代码似乎还可以,但是...让我们扩展宏:

int next_even_or_zero = get_counter() % 2 == 0 ? get_counter() : 0;

您可以看到宏只能返回奇数 - 这与预期(或所需的)相反。

问题:有什么方法可以按照宏观的意图获得这项工作?还是常规功能是唯一要走的方法?

//This works as wanted
int even_or_zero(int value) { return value % 2 == 0 ? value : 0; }
#define EVEN_OR_ZERO(cc) even_or_zero(cc)

这可能是一个完美的答案或一个坏笑话,具体取决于您为什么需要一个宏(您没有告诉我们的宏)。

答案很简单:除非有充分的理由,否则不要使用宏。这种情况不是其中之一:

int even_or_zero(int i) {
    if (i % 2) {
        return 0;
    } else {
        return i;
    }
}

制作两个功能。

int getCurrentCounter() { ... } // just return here
int getNextCounter() { ... } // increment here

这就是 - 示例 - 序列是psql的工作。


另外,这似乎是非常糟糕的代码设计。

  • 不要在C 中使用宏,有更多更好的方法可以在不使用它们的情况下实现您想要的东西
  • 在全局变量上具有副作用的功能不是很好。考虑一下,使用其计数器创建结构/类并不更好,然后添加方法。或者更好的是,可以将方法隐藏为固定方法/班级的prive,以限制谁可能影响柜台。