我很难理解为什么编译以下程序失败
// 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打印警告)。我可以依靠任何遵循相同方式的编译器吗?
答案 0 :(得分:2)
问题在于换行符也已转义。当我尝试在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
语句时大喊大叫。