【发布时间】:2013-08-27 20:16:52
【问题描述】:
我一直在查看 code golf 并想到尝试此代码:
#define D #define 添加此行后,一切正常,但是我将其扩展为:
#define D #define
D VALUE
在这里我得到了 5 个编译错误。如果我将D 更改为#define 一切都很好,谁能解释一下,为什么这段代码是非法的?
注意:我使用的是 VS2008 编译器。
编辑:经过一些回答,我发现我需要提供编译错误列表:
- 错误 C2121:“#”:无效字符:可能是宏扩展的结果
- 错误 C2146:语法错误:缺少 ';'在标识符“VALUE”之前
- 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int
- 错误 C2144:语法错误:'void' 应以';'开头
- 错误 C4430:缺少类型说明符 - 假定为 int。注意:C++ 不支持 default-int
第一个错误显示D不仅仅是define,还包括#。
【问题讨论】:
-
由于它可能依赖于实现,请说明您正在使用哪个编译器。
-
"为什么这个代码是非法的?" - 因为你不能重新定义预处理器指令。
-
@H2CO3 我能够重新定义它,因为它第一次工作,但是在使用该定义后我得到了编译错误。
-
@user2623967 C 预处理器没有定义元语法。
-
@user2623967:不,您无法重新定义它。除非您使用预处理器宏,否则它不会被扩展,因此不会被检查。在这种特殊情况下,扩展并没有按照您的想法进行。
标签: c++ c c-preprocessor preprocessor-directive