获取 if 语句以检查定义的宏
Getting an if-statement to also check for a defined macro
我有一个 if-else
,其中 if
应该检查一个标志以及是否定义了宏。我提出了两种解决方案,但不确定使用哪一种。
- 执行时间会有差异吗(或者编译器优化会消除这种差异)?
- 如果未定义标志(即由于示例代码上方或下方编写的行),第一个解决方案是否会导致
else
错误?
此外:
- 是否有适用于这种情况的普遍遵循的最佳做法?
1
#ifdef FLAG_A
if(flagB)
{
...
}
else
#endif
{
...
}
2
#ifdef FLAG_A
bool flagA = true;
#else
bool flagA = false;
#endif
if(flagA && flagB)
{
...
}
else
{
...
}
如果 flagA 变量在局部范围内(并且在该范围内保持未修改),则两者将编译为完全相同(对于大多数编译器,在非调试版本中)。但是,如果 flagA 是全局的,则需要将其声明为 'constexpr' (在其他情况下这可能是个好主意!)。
证明:https://godbolt.org/z/r9nra5
在最佳实践方面,我相信每个人都会根据自己的喜好加入,但我更喜欢版本 1。唯一的原因是,#ifdef / #endif 块中的代码立即很清楚有条件地编译。在查看案例 2 时可能不会立即显而易见。
我有一个 if-else
,其中 if
应该检查一个标志以及是否定义了宏。我提出了两种解决方案,但不确定使用哪一种。
- 执行时间会有差异吗(或者编译器优化会消除这种差异)?
- 如果未定义标志(即由于示例代码上方或下方编写的行),第一个解决方案是否会导致
else
错误?
此外:
- 是否有适用于这种情况的普遍遵循的最佳做法?
1
#ifdef FLAG_A
if(flagB)
{
...
}
else
#endif
{
...
}
2
#ifdef FLAG_A
bool flagA = true;
#else
bool flagA = false;
#endif
if(flagA && flagB)
{
...
}
else
{
...
}
如果 flagA 变量在局部范围内(并且在该范围内保持未修改),则两者将编译为完全相同(对于大多数编译器,在非调试版本中)。但是,如果 flagA 是全局的,则需要将其声明为 'constexpr' (在其他情况下这可能是个好主意!)。
证明:https://godbolt.org/z/r9nra5
在最佳实践方面,我相信每个人都会根据自己的喜好加入,但我更喜欢版本 1。唯一的原因是,#ifdef / #endif 块中的代码立即很清楚有条件地编译。在查看案例 2 时可能不会立即显而易见。