【问题标题】:Inserting a one-line line comment with a preprocessor macro使用预处理器宏插入单行注释
【发布时间】:2015-02-25 17:34:08
【问题描述】:

是否可以使用预处理器宏(或魔术)模拟单行注释(//)?比如这个可以用gcc -std=c99编译吗?

#define LINE_COMMENT() ???

int main() {
    LINE_COMMENT()  asd(*&#@)($*?><?><":}{)(@
    return 0;
}

【问题讨论】:

  • 我不认为这是可能的或有用的。
  • 在 C 中,有选择地注释掉代码部分是通过 #if 等来完成的。

标签: c gcc macros c-preprocessor


【解决方案1】:

没有。以下是标准的摘录,显示了 C 程序的翻译阶段:

  1. 源文件被分解为预处理标记和空白字符序列(包括 cmets)。源文件不应以部分预处理标记或部分注释结尾。每个注释被一个空格字符替换。保留换行符。是否保留除换行符以外的每个非空空白字符序列还是由一个空格字符替换是由实现定义的。

  2. 执行预处理指令,扩展宏调用,并执行_Pragma 一元运算符表达式。如果与通用字符名称的语法匹配的字符序列由标记连接 (6.10.3.3) 生成,则行为未定义。 #include 预处理指令导致命名的头文件或源文件从阶段 1 到阶段 4 以递归方式进行处理。然后删除所有预处理指令。

如您所见,在扩展宏之前删除了 cmets,因此宏无法扩展为注释。

您显然可以定义一个带有参数并扩展为空的宏,但它比注释稍微严格一些,因为它的参数必须仅包含有效的预处理器标记字符(例如,没有 @ 或不匹配的引号)。对于一般评论目的不是很有用。

【讨论】:

  • 宏参数不能包含不匹配的引号或不匹配的括号。但是@没有问题;它是一个有效的预处理令牌,但不是一个有效的令牌。只要宏参数被字符串化或未扩展,它就可以在宏参数中使用。
【解决方案2】:

没有。注释在预处理器阶段处理。您可以使用 #if 指令进行选择性编译(不考虑 cmets),如下所示:

#if 0
...  // this stuff will not be compiled
...
#endif // up to here.

这就是 C/C++ 中可用的有限宏预处理器所能做的所有事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2016-09-02
    • 2021-12-29
    • 1970-01-01
    • 2015-04-15
    相关资源
    最近更新 更多