我可以评论多行宏吗?

新手上路,请多包涵

我正在编写一些大型宏,并认为如果可以向它们添加注释会很好,如下所示:

 #define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL() \ // this does...
  SOME_OTHER_FUNCTION_CALL()

当我运行它时,我得到:

prog.cpp:9:2:错误:程序中出现杂散“\”

有什么办法可以解决这个问题,还是不能评论多行宏?

原文由 quant 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 311
1 个回答

除了宏的最后一行,没有办法在宏中使用 // comments

正如 Paul R 所建议的, /* comment */ 确实有效,并且似乎是唯一的选择:

 #define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL()  /* this does... */ \
  SOME_OTHER_FUNCTION_CALL()

原因如下。 编程语言 C ++ 标准(我只能访问此草案)指定源文件的物理行可以连接成编译器将看到的逻辑行,方法是使用 \ 后跟换行符:

每个反斜杠字符 () 的实例紧跟一个换行符被删除,拼接物理源代码行以形成逻辑源代码行。只有任何物理源行上的最后一个反斜杠才有资格成为此类接头的一部分。

这可以在预处理器输出中轻松检查:create file.cpp with

 pri\
ntf ("Hell\
o world"\
);

然后

cpp file.cpp

printf ("Hello world");

或者

printf
    ("Hello world");

这是编译器看到的(在 Ubuntu 上检查;您的里程可能会有所不同)。

现在,将此规则应用于多行宏,

 #define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL() \
  SOME_OTHER_FUNCTION_CALL()

被预处理器理解为

#define SOME_BIG_MACRO(input)   SOME_FUNCTION_CALL()   SOME_OTHER_FUNCTION_CALL()

因为所有 \ 和下一个换行符都被忽略了。

相似地,

 #define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL()  /* this does... */ \
  SOME_OTHER_FUNCTION_CALL()

被预处理器视为

#define SOME_BIG_MACRO(input)   SOME_FUNCTION_CALL()  /* this does... */   SOME_OTHER_FUNCTION_CALL()

然而,

 #define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL()  \ // this does...
  SOME_OTHER_FUNCTION_CALL()

变成两行:

 #define SOME_BIG_MACRO(input)   SOME_FUNCTION_CALL()  \ // this does...
  SOME_OTHER_FUNCTION_CALL()

因为第二个 \ 后面没有换行符,因此被保留,以及前面没有 \ 的换行符。这会导致编译错误。

尽管

#define SOME_BIG_MACRO(input)\
  SOME_FUNCTION_CALL()  // this does... \
  SOME_OTHER_FUNCTION_CALL()

变成一行:

 #define SOME_BIG_MACRO(input)  SOME_FUNCTION_CALL()  // this does...   SOME_OTHER_FUNCTION_CALL()

这在语法上是正确的,但宏不完整。一些编译器将此报告为错误,因为这很可能不是程序员的意图。其他的,例如 Ubuntu cc ,默默地应用标准定义的规则。

由于一个宏只能占用一个 逻辑 行(尽管是几行物理行,使用换行符转义机制),因此该行上的任何 // comment 都会导致宏的所有其余部分被忽略。

结论: // comment 只能出现在(多行或单行)宏的末尾,而 /* comment */ 可以完美地在宏内部使用。

原文由 Alexander Gelbukh 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题