我想知道GCC怎么知道错误在哪里(在源代码中),而它的预处理器已经删除了注释?我用谷歌搜索了一下,但没找到.我会解释我的意思:
我有这样的C代码:
int main(void)
{
return /* comment */ ) /* another comment */0;
}
‘)’字符(第24个字符)的位置存在语法错误.然后我通过GCC预处理器(gcc -E main.c
)对其进行过滤,结果是:
# 0 "main.c"
# 0 "<built-in>"
# 0 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 0 "<command-line>" 2
# 1 "main.c"
int main(void)
{
return ) 0;
}
好吧,我还是明白这些步骤的.预处理器已删除注释.但事情是这样的.由于删除了注释,现在语法错误位于第10个字符(而不是第24个字符)的位置.那么,它如何知道语法错误的确切位置呢?(如下面的输出所示)
main.c: In function ‘main’:
main.c:3:24: error: expected expression before ‘)’ token
3 | return /* comment */ ) /* another comment */0;
| ^
main.c:3:24: error: expected statement before ‘)’ token
我发现#line
标记有一些东西,但在预处理器输出中,没有这样的#line
标记.
那么,到底有什么魔力呢?