是否应该定义 #if 中使用的宏?
Should a macro used in #if be defined?
# if RTC
/* some code */
# endif
是否应该用值定义宏RTC
?我的编译器没有抛出错误。所有编译器都这样做吗?定义宏不是更安全吗?
在这样的预处理指令中,如果未定义宏,则将其视为0
。
这是由语言保证的。
您可以依靠没有编译失败。
这是C++措辞:
[cpp.cond]/11
:在执行了由于宏扩展和对定义的宏表达式、has-include-表达式和has-attribute-表达式的计算而进行的所有替换后,除true
和false
外,所有剩余的标识符和关键字都将替换为pp-number0
,然后将每个预处理标记转换为令牌。[..]
不,它不必定义。如果在#if
扩展结束时未定义标识符,则其计算结果为0
。
从 ANSI C90:
在执行了由于宏扩展和
defined
一元运算符而导致的所有替换后,所有剩余的标识符都将替换为 pp 编号0
。
但是,在 C 标准化之前的编译器中可能不存在这一点。我曾经看到过一个关于这个的海湾合作委员会警告(我认为它是在MinGW上(,但我现在找不到它的来源。
结论:所有符合标准的 C 编译器在遇到此问题时都不应抛出错误。在#if
中使用宏之前,无需定义宏。
相关文章:
- c++:定义if语句中的模板
- 获取 if 语句以检查定义的宏
- 如何在C++中为 if 和 else 语句定义新行为
- 如何定义此"if block"中其他无效输入的值,以便在c ++中将字符串转换为对象?
- 是否应该定义 #if 中使用的宏?
- c if语句:第一个条件取代第二个ub或定义良好
- 在"if"条件中定义 fstream
- C 使用功能定义中的if/其他语句以返回最小的数字
- 为什么我不能在 If 语句中定义多个变量以相互相等?
- C多行宏问题:为什么不使用if(1){..}而不是do{..}while(0)在多行宏定义中
- 奇怪的错误:标签'loopend'使用但未定义," if "之前应为非限定 id("goto"和" '}' token "错误相同
- 如何在 if 条件中区分零和未定义
- 如何在if/else序列中定义未知类型的全局变量
- C++对方法和What-if所有东西都转到.h的未定义引用
- 为什么if语句中未定义的参数不会导致segfault或其他错误
- 自定义C++谓词并查找if
- 获取 while、if 和 for 语句的用户定义类的对象值
- 0 && 定义(_LP64)#if 如何为真?
- 为什么定义 #if 0 && (_MSC_VER > 1000)?
- 定义 if 块内部的常量"variable"