此问题已经在这里有了答案:
我很难理解为什么编译以下程序失败
// This is comment \
int main(void) {
return 0;
}
注意\
字符后有空格(0x20)。编译失败,并带有
+ $ gcc test.c -std=c11 -pedantic
test.c:3:2: error: expected identifier or ‘(’ before ‘return’
3 | return 0;
| ^~~~~~
test.c:4:1: error: expected identifier or ‘(’ before ‘}’ token
4 | }
| ^
而且我不明白为什么。阅读C11标准(最新草案),第5.1.1.2节第2点指出(强调我的意思)
每个反斜杠字符(\)立即后跟换行符被删除,将物理源代码行拼接以形成逻辑源代码行。只有任何物理源代码行上的最后一个反斜杠才有资格成为一部分这样的接头。不为空的源文件应以换行符结尾,在进行任何此类拆分之前,不得在其后紧接反斜杠字符。
我想念的是什么?这是否符合标准? gcc和clang的行为方式相同(尽管clang打印警告)。我可以依靠任何遵循相同方式的编译器吗?
问题是换行符也已转义。当我尝试在MacOS上编译时,收到以下警告:
t.c:1:20: warning: backslash and newline separated by space
[-Wbackslash-newline-escape]
// This is comment \
^
t.c:1:21: warning: multi-line // comment [-Wcomment]
// This is comment \
^
所以这部分:
int main(void) {
也被评论。你剩下的
return 0;
}
并且编译器甚至没有时间到达孤立的}
,它在函数外看到return
语句时大喊大叫。