我可以测试预处理器指令的值吗?

Can I test the value of a preprocessor directive?

我有一个我没有设置的预处理器指令,所以我无法更改它,它要么是 true 要么是 false。

通常我会这样做:

#ifdef DIRECTIVE
// code
#endif

但这将始终 运行,因为 DIRECTIVE 始终已定义。

有没有一种方法可以基本上相当于:

#if DIRECTIVE
#endif

我想我可以做到

bool DirectiveValue = DIRECTIVE;
if (DirectiveValue){

}

但我真的希望第二个代码块能够以某种方式实现。

感谢您的任何见解!

预处理器有一个 #if 语句,因此您可以执行以下操作:#if DIRECTIVE,如果表达式的值为零,它(就像在 C 中一样)测试为 false,并且如果表达式的值为 non-zero.

,则为真

虽然不清楚它是否为您提供了真正的优势,但还有一种中间形式:if constexpr (DIRECTIVE),它是在编译时评估的,没有运行时间,所以它类似于#if 在某种程度上是这样——但仍然使用普通的 C++ 语法,并与一般的语言集成,而不是它自己的小东西,规则与编译器的其余部分略有不同。

您可以在 #if 之后评估布尔语句,因此此代码有效:

#if (DIRECTIVE == true)
// code
#endif

如果您有更复杂的检查,值得注意的是 defined 关键字,returns 如果定义了符号,则为 0 或 1。这和编写布尔语句的能力允许您创建这样的检查:

#define DIRECTIVE_A
#define DIRECTIVE_B

#if defined(DIRECTIVE_A) && defined(DIRECTIVE_B)
// code
#endif