一. 预处理阶段对注释的处理
我们知道一个源文件要变成可执行程序的话,首先要经过预处理,预处理阶段完成的任务包括:头文件展开、宏替换、条件编译、去掉注释。
那具体是怎么去掉注释的呢?下面我们写一段包含注释的代码来测试:
// tes.c #include <stdio.h> int main() { int /* */ i = 10; // this is a // valid comment in/* */t j = 20; return 0; }
下面我们对源文件进行预处理操作:gcc -E test.c -o test.i,生成一个叫做 test.i 的文件,打开文件可以看到预处理后的代码:
二. 注释使用时的注意事项
1. C风格的注释无法嵌套使用
C风格的注释:/* */
C++风格的注释://
下面C风格注释的使用是错误的,/*和*/不能嵌套使用,因为/*总是与离它最近的*/匹配:
#include <stdio.h> int main() { /* /*printf("hello world"); printf("hello world");*/ */ return 0; }
2. 基本注释注意事项
#include <stdio.h> int main() { int /* */ i; // 正确 in/* */t j; // 报错,因为预处理后注释会被替换成空格 // 正确,此时的//不算作注释 // 因为它在双引号里面 // 编译器会优先把它识别为字符串的一部分 char *s = "abcdefgh //hijklmn"; return 0; }
3. 注释导致的二义性
下面是测试代码:
#include <stdio.h> int main() { int x = 10; int y = 0; int *p = &y; y = x/*p; return 0; }
编译后会在这里报错y = x/*p,因为 / 会优先与 * 结合作为一个注释符号。正确的写法应该是在 / 后面加上一个空格或者对 *p 加上一个括号。
// 正确的写法 y = x/ *p; y = x/(*p);
四. 关于注释的一个使用建议
复杂的函数中,会有很多分支、循环的嵌套,如果它们的行数也有很多的话,我们在阅读的时候容易搞混,不知道哪个循环或分支从哪里开始或者是从哪里结束。
所以建议在分支语句、循环语句结束之后加上注释,这样方便区分各分支或循环体。