<p>//不能放在语句中间,否则导致语法错误;/ /可插入语句中间但需紧贴token避免断开;大段代码禁用应使用#if 0而非嵌套注释。</p>

单行注释 // 不能放在语句中间
编译器会把 // 后直到行末的所有内容(包括本该是语句的一部分)全部当作注释丢弃,导致语法错误。比如:
int x = 10 /* valid */ + // this breaks the line
20;这实际被解析为 int x = 10 /* valid */ + ; —— 缺少右操作数,编译失败。
常见错误现象:expected primary-expression before ‘;’ token 或类似语法错误。
正确做法:
立即学习“C++免费学习笔记(深入)”;
-
//只能放在语句开头(整行注释)或语句末尾(如int a = 5; // init) - 若想在逻辑上“打断”语句加说明,应改用多行注释
/* ... */
多行注释 /* */ 可以安全插入语句中间
因为 /* */ 是词法层面的注释,编译器将其整体替换为空格,只要不破坏 token 边界,就不会出错。
例如这些写法都合法:
int y = 100 /* offset for safety */ + 2 * /* scale factor */ 3;
std::vector<int> v(/* capacity */ 16);
但要注意:
- 不能嵌套:写
/* outer /* inner */ outer */会导致第一个*/就结束注释,后续代码可能变成非法语法 - 不能跨 token 切割:比如
in/*t*/ a;是错的——in和a之间没空格,拼成ina,不再是int类型声明 - 注释内不能出现未闭合的字符串字面量或字符常量(虽不报错,但易引发歧义)
想临时禁用大段代码?别硬塞注释进语句里
遇到需要屏蔽几十行、含多个 /* */ 的代码块时,强行用多行注释包裹极易出错。这时候更可靠的是预处理开关:
#if 0
int buggy_func() {
/* lots of code with its own /* nested */ comments */
return /* something */ 42;
}
#endif#if 0 不受注释语法限制,可安全包裹任意合法 C++ 代码,包括已有注释、宏、甚至不完整语句(只要在 #if 0 范围内)。
对比下来:
-
/* */适合局部、短小、结构清晰的插入说明 -
#if 0适合调试时整块关闭代码,尤其是工程中已有复杂注释的区域 - 编辑器快捷键(如 Ctrl+/)通常只作用于
//,对/* */或#if 0无感,手动处理时需格外留心闭合
容易被忽略的细节:注释不是空格,但表现像空格
虽然文档常说“编译器把注释当空格处理”,但严格来说,它替换为**一个空格字符**,而非零个或多个。这意味着:
-
foo/* */bar()→foo bar()(带空格,变成两个 token,调用失败) -
foo/* comment */bar()→foobar()(紧挨着,合法函数名) - 所以
/* */中间**不能留空格**,否则可能意外断开标识符或操作符 - 最稳妥的插入方式是紧贴 token:如
value/* clamp */= std::min(value, max_val);
真正在语句中间加注释时,宁可多换一行写 //,也比冒险在 token 间隙塞 /* */ 更可控。


















