|
发表于 2007-9-2 17:59:07
|
显示全部楼层
GNU cpp 是指 GNU C 预处理器,而不是 C++
因此
If the defined operator appears as a result of a macro expansion, the C standard says the behavior is undefined. GNU cpp treats it as a genuine defined operator and evaluates it normally.
也许翻译成下面的样子更好
以宏扩展结果的形式出现的 defined 运算符根据 C 标准的规定,是属于未定义行为的。 GNU 的 C 预处理器把这种情况下的 defined 视为一个正式的运算符,并以通常的方法对其进行处理。
这种生硬的翻译还是无法让人理解它的含义,那么我就根据个人的理解对它进行一下说明,不保证这种解释是正确的,但至少可以保证提到的 gcc 相关的内容是经过实践检验的
假如有这样一段代码
- #define A
- #define XX defined(A)
- #if XX
- # warning 123
- #else
- # warning 456
- #endif
复制代码
那么编译时给出的信息应该是怎样的呢?上面那句翻译中的意思应该是指在 C 语言标准中这种情况属于未定义情况,就是说不同的编译器可以自行对其做出处理。对 gcc 编译而言,这段代码给出 123 的警告,而如果没有第一行关于 A 的定义,那么就给出 456 的警告。
这与楼上兄弟的理解是有较大的偏差的
另外宏名必须是标识符,这也是 C 标准规定的,有效的宏替换的构成与函数名,变量名等是相同的,要满足 [_a-zA-Z][_a-zA-Z0-9]* 的形式。而且出现在字符串中的内容是不会被视为宏名的。因此即使有了 #define XX 123 这样的语句,那么 printf("%s\n", "XX"); 也还是会输出 XX 而不是 123
如果想实现楼上兄弟预期的目的,大家一般是写成如下形式的
- #define ADD '+'
- #ifdef ADD
- putchar(ADD);
- #endif
复制代码 |
|