我正在使用一个#ifdef
块来有条件地包含一个基于 -Dflag
传递给编译器的代码块。
有没有办法用一个来实现这个if
?
类似于以下内容:
if (defined(flag)) {
}
我正在使用一个#ifdef
块来有条件地包含一个基于 -Dflag
传递给编译器的代码块。
有没有办法用一个来实现这个if
?
类似于以下内容:
if (defined(flag)) {
}
如果您定义一个宏以使其计算结果为零或非零,那么您可以在if
语句的条件中使用它。由于它是一个编译时常量,如果它为零,编译器中的死代码消除器传递将无论如何都会删除无法访问的代码。
您使用预处理器生成不同的标志,可以使用运行时if
语句对其进行测试,如下所示:
#ifdef flag
#define flag_defined 1
#else
#define flag_defined 0
#endif
现在你可以这样做:
if (flag_defined) ...
如果您愿意给出flag
一个值(0或1)而不是定义它,您可以这样做
cc -Dflag=1 file.c
和
if (flag) { ... }
不会用丑陋的 s 弄乱你的代码#ifdef
。您还可以避免忘记定义flag
:在这种情况下,您的编译器将flag
其视为标识符。由于您从未声明过它,因此您将收到有关 undeclared 或 undefined symbol 的编译时错误flag
。
不,您不能使用 C if 语句来检查是否定义了预处理器标记。您可以使用其中一种形式
#ifdef flag
...
#endif
#if defined(flag)
...
#endif
但是,您可以检查令牌的计算结果是否为真/假 C 表达式,
如果你使用-Dflag=1
你可以做
if (flag) {
...
}
如果你想关闭它,你可以将宏定义为-Dflag=0
在此之后,您可以定义一个新的预处理器标记,您可以使用 C if 语句检查它。例如
#ifdef flag
#define FLAG_SET 1
#else
#define FLAG_SET 0
#endif
if(FLAG_SET) { //the flag macro was defined
...
}
如果您只想检查标志是否已定义,那么所有这些都没有意义,只需使用#ifdef
. 使用 Cif
语句,大多数 C 编译器将优化代码,在运行时您无法更改任何内容以获得不使用预处理器的任何好处。
#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
初始化后更改 的值,那么您可能应该 make it const
。