我使用#ifdef
块有条件地包含基于 - Dflag
传递给编译器的代码块。
有没有办法用if
实现这个?
有些事情:
if (defined(flag)) {
}
答案 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
。