对条件包含的怀疑

时间:2010-12-29 13:01:27

标签: c++ c language-agnostic

这实际上是从我的模块中提取的(C中的预处理器)

条件表达式可以包含除赋值运算符,递增和递减运算符之外的任何C运算符。

我不确定我是否收到此声明,因为我尝试使用this并且它有效。对于其他操作,可能的解决方法是简单地在条件表达式中声明宏或函数,{ {3}}

此外,我不明白这条规则背后的理由是什么。有人可以解释一下吗?

由于

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中,首先将XY替换为其宏扩展(分别为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

等,而不是您定义的宏内的代码。