"is defined"宏检查及其调用必须处于不同的条件下吗?
Must a "is defined" macro check and its call be in separate conditions?
在SO上,我很难找到许多涉及这个主题的答案,但这里有一些看起来很无辜的代码,当F
不是一个定义的宏时,它无法编译
int main() {
#if defined(F) && F(0, 2, 0)
return 0;
#endif
return 1;
}
根据GCC手册的这一节,问题是在#if
表达式中,"在表达式值的实际计算开始之前,表达式中的所有宏都已展开",因此这是一个无效的检查,因为当F
未定义时,我看到
test.cpp:2:20: error: missing binary operator before token "("
#if defined(F) && F(0, 2, 0)
^
我的问题是:只有这样才能正确地进行检查吗?
int main() {
#if defined(F)
#if F(0, 2, 0)
return 0;
#endif
#endif
return 1;
}
我觉得这很难看,也很不直观,所以我希望有一种更好的方法在预处理器中做这些事情。
假设您的F
宏是在某个头文件中定义的,您可以将以下代码放在include和它的第一次使用之间:
#ifndef F
#define F(a,b,c) 0
#endif
或者另一个合理的违约。这是解决你问题的常用方法。另一个是不允许这样的宏未定义,但需要默认值或期望执行的任何操作对于配置文件来说更安全一点,因为这表明作者确实考虑了宏,并且是有意的选择了一个值(即他没有忘记定义它(。如果定义在同一个文件中,也会更容易。
那么你的测试就是:
#if F(0, 2, 0)
避免嵌套条件(如果某个地方需要#else
,则会导致额外的麻烦。
两个忠告:
- 只有在合理的情况下,才能谨慎使用宏。C++特别提供了减少对宏的需求的功能
- 不要对宏使用单字母名称。请记住,它们是文本替换,与正常语言语法不同。请使用不言自明的名称(这不仅适用于宏,而且对于那些更相关的宏(
相关文章:
- 为什么简单的算术减法在"if"条件下不起作用?
- 如何在 LIBSVM 中定义具有不同条件的交叉验证?
- 在什么条件下使用 std::memcpy 在对象之间复制是安全的?
- 改进简单条件下C++样式
- 唤醒多个线程以在每个条件下工作一次
- 如何泛化作用于不同类型的向量的函数?
- 由于相同的文件名/类名存在于不同的SO中而导致的SEG错误
- "is defined"宏检查及其调用必须处于不同的条件下吗?
- 在if条件下,右或左改变值的相等性检查是否有任何区别
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- 在 constexpr-if 条件下比较 constexpr 函数参数会导致错误
- 轮班操作在条件下使用的说明
- 在不同条件下无法访问我的向量变量
- 在某些条件下最大化 GCD
- 具有不同条件的多个 for 循环
- 如何更改此空隙函数,以便在特殊条件下返回一个生成的字符串
- 在if-Statement条件下与分配有关的错误
- 如何正确使用“ sizeof”操作员在循环的条件下正确使用
- 提升::MSM 检查保护条件下的状态转换
- C++在两个不同的条件下执行/while循环