我注意到这个程序用gcc编译:
#define X(A) A
int x = X(
#line 3 "test1.c"
0
);
但是,Visual Studio无法编译它:
main.cpp
main.cpp(6): error C2121: '#': invalid character: possibly the result of a macro expansion
main.cpp(6): error C2065: 'line': undeclared identifier
main.cpp(6): error C2143: syntax error: missing ';' before 'constant'
main.cpp(6): error C2059: syntax error: 'constant'
我想知道:程序是否合法,或者它是否默默地依赖于未定义(或实现定义)的行为,恰好使gcc接受代码?
答案 0 :(得分:7)
它无效。行为未定义,因此不需要诊断,并且允许实现接受代码。
从C标准,6.10.3宏替换:
11 [...]如果在参数列表中有预处理令牌序列,否则它们将充当预处理指令,行为未定义。
C ++标准在16.3宏替换中包含这些完全相同的单词。
答案 1 :(得分:3)
如果您使用所有警告编译示例,gcc将为您提供:
警告:在宏参数中嵌入指令是不可移植的
和clang给你:
警告:在宏参数中嵌入指令具有未定义的行为
这绝对强烈暗示我的行为确实是不确定的。