我可以测试预处理器指令的值吗?
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
我有一个我没有设置的预处理器指令,所以我无法更改它,它要么是 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