使用if子句而不是处理器#ifdef

时间:2013-05-30 19:09:15

标签: c compiler-flags

我使用#ifdef块有条件地包含基于 - Dflag传递给编译器的代码块。

有没有办法用if实现这个?

有些事情:

if (defined(flag)) {

}

5 个答案:

答案 0 :(得分:5)

如果定义宏以使其计算为零或非零,则可以在if语句的条件下使用它。由于它是一个编译时常量,如果它为零,编译器中的死代码消除器传递将删除无法访问的代码。

答案 1 :(得分:5)

使用预处理器生成不同的标志,可以使用运行时if语句对其进行测试,如下所示:

#ifdef flag
#define flag_defined 1
#else
#define flag_defined 0
#endif

现在你可以这样做:

if (flag_defined) ...

答案 2 :(得分:3)

如果你愿意给flag一个值(0或1)而不是定义它,你可以做

cc -Dflag=1 file.c

if (flag) { ... }

没有用丑陋的#ifdef来搞乱您的代码。您也可以防止忘记定义flag:在这种情况下,您的编译器会将flag视为标识符。由于您从未声明它,因此您将收到有关未声明或未定义符号flag的编译时错误。

答案 3 :(得分:1)

不,您不能使用C if语句来检查是否定义了预处理程序令牌。 您可以使用其中一种形式

#ifdef flag
...
#endif

#if defined(flag)
...
#endif

但是,您可以检查令牌是否计算为真/假C表达式

如果您使用-Dflag=1,则可以

if (flag) {
  ...
}

如果您想将其关闭,可以将宏定义为-Dflag=0

在此之后,您可以定义一个新的预处理程序标记,您可以使用C if语句进行检查。 e.g。

#ifdef flag
#define FLAG_SET 1
#else
#define FLAG_SET 0
#endif

if(FLAG_SET) { //the flag macro was defined
...
}

如果您要做的就是检查是否已定义该标志,那么就没有任何意义,只需使用#ifdef即可。使用C if语句,大多数C编译器将优化代码,在运行时没有什么可以改变以获得不使用预处理器的任何好处。

答案 4 :(得分:1)

#ifdef FLAG
#define FLAG_VALUE 1
#else
#define FLAG_VALUE 0
#endif

int flag = FLAG_VALUE;

...

if(flag)
{
    ....
}

或者,只需根据需要使用-DFLAG_VALUE=1-DFLAG_VALUE=0并直接使用FLAG_VALUE

如果您打算在运行时更改FLAG_VALUE,则需要一个变量。如果你以非显而易见的方式进行更改(例如通过调试器或其他加载器技巧),请确保将其声明为volatile,否则编译器可能会执行死代码删除并删除大量代码。

此外,如果您不打算在初始化后更改flag的值,那么您应该将其设为const