1

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

有没有办法用一个来实现这个if

类似于以下内容:

if (defined(flag)) {

}
4

5 回答 5

5

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

于 2013-05-30T19:11:14.780 回答
5

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

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

现在你可以这样做:

if (flag_defined) ...
于 2013-05-30T19:11:27.383 回答
3

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

cc -Dflag=1 file.c

if (flag) { ... }

不会用丑陋的 s 弄乱你的代码#ifdef。您还可以避免忘记定义flag:在这种情况下,您的编译器将flag其视为标识符。由于您从未声明过它,因此您将收到有关 undeclared 或 undefined symbol 的编译时错误flag

于 2013-05-30T19:13:26.830 回答
1

不,您不能使用 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 编译器将优化代码,在运行时您无法更改任何内容以获得不使用预处理器的任何好处。

于 2013-05-30T19:12:47.170 回答
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初始化后更改 的值,那么您可能应该 make it const

于 2013-05-30T19:14:03.560 回答