在宏参数中使用#line指令是否合法?

时间:2015-02-05 12:04:10

标签: c++ c visual-studio gcc

我注意到这个程序用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接受代码?

2 个答案:

答案 0 :(得分:7)

它无效。行为未定义,因此不需要诊断,并且允许实现接受代码。

从C标准,6.10.3宏替换:

  

11 [...]如果在参数列表中有预处理令牌序列,否则它们将充当预处理指令,行为未定义。

C ++标准在16.3宏替换中包含这些完全相同的单词。

答案 1 :(得分:3)

如果您使用所有警告编译示例,gcc将为您提供:

  

警告:在宏参数中嵌入指令是不可移植的

和clang给你:

  

警告:在宏参数中嵌入指令具有未定义的行为

这绝对强烈暗示我的行为确实是不确定的。