是否可以使用预处理器宏(或魔术)模拟单行注释(//
)?例如,可以使用gcc -std=c99
进行编译吗?
#define LINE_COMMENT() ???
int main() {
LINE_COMMENT() asd(*&#@)($*?><?><":}{)(@
return 0;
}
答案 0 :(得分:5)
没有。以下是标准的摘录,显示了C程序的翻译阶段:
- 是否保留或替换为新行以外的每个非空白字符序列都是由一个空格字符替换的。
源文件被分解为预处理标记和空白字符序列(包括注释)。源文件不应以部分预处理标记或部分注释结束。每个注释都被一个空格字符替换。保留换行符。
- 醇>
执行预处理指令,扩展宏调用,并执行
_Pragma
一元运算符表达式。如果通过标记连接(6.10.3.3)生成与通用字符名称的语法匹配的字符序列,则行为未定义。#include
预处理指令使得命名的头文件或源文件以递归方式从阶段1到阶段4进行处理。然后删除所有预处理指令。
如您所见,在扩展宏之前删除了注释,因此宏无法扩展为注释。
你可以明显地定义一个带参数并扩展为空的宏,但它比注释稍微限制一些,因为它的参数必须只包含有效的cpp标记字符(例如,没有@
或不匹配的引号) 。对于一般评论目的不是很有用。
答案 1 :(得分:0)
没有。评论在预处理器阶段处理。您可以使用#if
指令进行选择性编译(不考虑注释),如:
#if 0
... // this stuff will not be compiled
...
#endif // up to here.
使用C / C ++中有限的宏预处理器可以做到这一切。