这实际上是从我的模块(C中的预处理器)中提取的。
条件表达式可以包含任何C运算符,但赋值运算符、增量运算符和递减运算符除外。
我不确定我是否得到了这条语句,因为我尝试使用这和worked.Also进行其他操作,可能的工作是简单地在条件表达式准确地说,就像这样中声明宏或函数。
而且,我也不明白这条规则背后的理由是什么。有人能解释一下吗?
谢谢
发布于 2010-12-29 13:24:07
你似乎误解了条件表达式指的是什么。
在这个片段里
#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,此计算失败时出错。
发布于 2010-12-29 13:09:21
条件表达式可以包含除赋值运算符、增量运算符和递减运算符以外的任何C运算符。
上面说,你不能写这些,
#if X = 4 //wrong
#if X++  //this too wrong
#if X-- //this too编辑:
我刚读到你对迭戈·塞维利亚职位的评论,
同意,但为什么不允许这样的事情(ideone.com/ahXDA)?
这段代码实际上相当于您在全局范围中编写的代码,
//global code
int b=7; 
b++;  //ill-formed!这在C(和C++)中是不允许的。不过,这在C中是允许的,
//legal in C Only
int b = 7;
int b; //well-formed!这里,第二个定义称为暂定定义。C标准在$6.9.2/2中,
对于没有初始化器的具有文件作用域的对象的标识符的声明,以及没有存储类说明符或具有存储类说明符静态的的声明构成暂定的definition.If翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,然后该行为就像翻译单元包含该标识符的文件范围声明一样,转换单元的复合类型作为翻译单元的末尾,其初始化器等于0。
这也意味着,不允许这样做,
//illegal in both C and C++
int b=7;
int b=8; //error 这不再是一个暂时的定义了。这是重新定义,这是不允许的!
发布于 2010-12-29 13:06:05
用粗体表示的段落指的是#if表达式,因此可以使用运算符:
#if VARIABLE > 3等等,而不是你定义的宏中的代码。
https://stackoverflow.com/questions/4554313
复制相似问题