它被指定为在翻译的第3阶段发生(§:2.2/1):
3 - 源文件被分解为预处理标记(2.5)和空白字符序列(包括注释).源文件不应以部分预处理标记或部分注释结束.每个注释都被一个空格字符替换.
[强调补充]
从字面上看,它们在扫描(词法分析)后被忽略了.
以前,我被愚弄了由以下事实:如果你启用了调试符号生成,源仍然存在,你可以看到他们在gdb或objdump:
00000000004004ec <main>:
int main()
{
4004ec: 55 push %rbp
4004ed: 48 89 e5 mov %rsp,%rbp
/* This is just a comment */
return 0;
4004f0: b8 00 00 00 00 mov $0x0,%eax
}
4004f5: 5d pop %rbp
4004f6: c3 retq
4004f7: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
4004fe: 00 00
Run Code Online (Sandbox Code Playgroud)
从代码
int main()
{
/* This is just a comment */
return 0;
}
Run Code Online (Sandbox Code Playgroud)
gcc -g -O0 1.c通过编译和获得objdump -CDgS a.out.这是因为这些工具在找到源文件时会读取它,并通过行号将二进制文件中找到的调试信息与源文件的内容相关联.