Ble*_*der 2 c macros gcc c-preprocessor
是否可以//
使用预处理器宏(或魔术)模拟单行注释()?例如,这可以编译gcc -std=c99
吗?
#define LINE_COMMENT() ???
int main() {
LINE_COMMENT() asd(*&#@)($*?><?><":}{)(@
return 0;
}
Run Code Online (Sandbox Code Playgroud)
不是.这是标准的摘录,显示了C程序的翻译阶段:
源文件被分解为预处理标记和空白字符序列(包括注释).源文件不应以部分预处理标记或部分注释结束.每个注释都被一个空格字符替换.保留换行符.是否保留或替换为新行以外的每个非空白字符序列是由实现定义的.
执行预处理指令,扩展宏调用,并
_Pragma
执行一元运算符表达式.如果通过标记连接(6.10.3.3)生成与通用字符名称的语法匹配的字符序列,则行为未定义.甲#include
预处理指令导致从第1阶段至第4阶段处理指定的头或源文件,递归.然后删除所有预处理指令.
如您所见,在扩展宏之前删除了注释,因此宏无法扩展为注释.
显然,您可以定义一个接受参数并扩展为空的宏,但它比注释稍微限制一些,因为它的参数必须只包含有效的cpp标记字符(例如,没有@
或不匹配的引号).对于一般评论目的不是很有用.