文章目录
- 一. 预处理阶段对注释的处理
- 二. 注释使用时的注意事项
- 1. C风格的注释无法嵌套使用
- 2. 基本注释注意事项
- 3. 注释导致的二义性
- 四. 关于注释的一个使用建议
一. 预处理阶段对注释的处理
我们知道一个源文件要变成可执行程序的话,首先要经过预处理,预处理阶段完成的任务包括:头文件展开、宏替换、条件编译、去掉注释。
那具体是怎么去掉注释的呢?下面我们写一段包含注释的代码来测试:
// 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);
四. 关于注释的一个使用建议
复杂的函数中,会有很多分支、循环的嵌套,如果它们的行数也有很多的话,我们在阅读的时候容易搞混,不知道哪个循环或分支从哪里开始或者是从哪里结束。
所以建议在分支语句、循环语句结束之后加上注释,这样方便区分各分支或循环体。