我在程序中添加了评论。
在编译,链接,加载等开发过程中将在哪个步骤中将其删除。
它被指定为在翻译的第 3 阶段发生(§:2.2/1):
3 - 源文件分解为预处理标记 (2.5) 和空白字符序列(包括注释)。源文件不应以部分预处理标记或部分注释结尾。每个注释被一个空格字符替换。
[重点补充]
从词法上讲,它们在扫描后被忽略(词法分析)。
以前,我被以下事实愚弄:如果您启用了调试符号生成,并且源仍然存在,您可以在gdb
or中看到它们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
从代码
int main()
{
/* This is just a comment */
return 0;
}
编译gcc -g -O0 1.c
并通过objdump -CDgS a.out
. 这是因为这些工具会在找到源文件时读取它,并通过行号将在二进制文件中找到的调试信息与源文件的内容相关联。
它们在预编译(词法分析阶段)期间被删除,因为在生成中间代码时,不需要注释。
说评论被删除是不正确的。最好说在编译期间解析器会跳过注释。
Parser 是一个程序,它开始读取您用英文编写的 C 代码并将其转换为汇编代码。解析器程序只是读取您用英文编写的代码并跳过以“/*”或“//”开头的句子。
因此注释不会被删除,它们存在于您的 C 代码中,而是被编译器跳过以创建汇编文件。
编译过程的词法分析阶段会删除程序中的注释。词法分析也称为扫描。
编译过程的词法分析部分会忽略输入字符串中的注释。
如果您想出于任何目的使用程序注释,则必须编写自己的解析器。