这实际上是从我的模块中提取的(C中的预处理器)
条件表达式可以包含除赋值运算符,递增和递减运算符之外的任何C运算符。
我不确定我是否收到此声明,因为我尝试使用this并且它有效。对于其他操作,可能的解决方法是简单地在条件表达式中声明宏或函数,{ {3}}
此外,我不明白这条规则背后的理由是什么。有人可以解释一下吗?
由于
答案 0 :(得分:5)
您似乎误解了条件表达式所指的短语 在这个片段中
#if defined TEST
int a = 0;
#endif
条件表达式是由#if测试的部分,意味着它是defined TEST
部分。
不允许赋值,递增和递减的原因是因为那些操作符想要更改变量,这在预处理器的上下文中是无意义的。
预处理器完全基于文本替换和对结果常量表达式的评估。
如果您有此代码
#define X a++
#define Y 42
#if X == Y
#endif
然后在测试#if X == Y
中,首先将X
和Y
替换为其宏扩展(分别为a++
和42
),从而产生
#if a++ == 42
接下来,a
被其宏扩展所取代。由于没有宏a
,因此将替换定义为0
:
#if 0++ == 42
现在没有可能的宏名称要扩展,因此预处理器会尝试评估条件。由于尝试增加常量0
,此评估将失败并显示错误。
答案 1 :(得分:4)
条件表达式可以 包含除了之外的任何C运算符 赋值运算符,增量和 减少运营商。
这说,你不能写这些,
#if X = 4 //wrong
#if X++ //this too wrong
#if X-- //this too
编辑:
我刚刚阅读了您对Diego Sevilla's post,
的评论同意,但为什么会这样 (ideone.com/ahXDA)是不允许的? - Philando Gullible
此代码实际上与您在全局范围内编写的代码相同,
//global code
int b=7;
b++; //ill-formed!
C(和C ++)中不允许这样做。但这只能在C ONLY中进行,
//legal in C Only
int b = 7;
int b; //well-formed!
此处第二个定义称为暂定定义。 C标准称6.9.2 / 2美元,
。的标识符声明 文件范围没有的文件的对象 初始化程序,没有 存储类说明符或与 存储类说明符static, 构成暂定定义。如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,则行为就像翻译单元包含该标识符的文件范围声明,其复合类型为翻译单元的末尾,初始值设定项等于0.
这再次暗示,不允许以下内容,
//illegal in both C and C++
int b=7;
int b=8; //error
这不再是一个暂定的定义了。这是重新定义,这是不允许的!
答案 2 :(得分:1)
以粗体显示的段落引用#if
表达式,因此您可以使用运算符:
#if VARIABLE > 3
等,而不是您定义的宏内的代码。