我正在编写一些大型宏,并认为如果可以向它们添加注释会很好,如下所示:
#define SOME_BIG_MACRO(input)\
SOME_FUNCTION_CALL() \ // this does...
SOME_OTHER_FUNCTION_CALL()
当我运行它时,我得到:
prog.cpp:9:2:错误:程序中出现杂散“\”
有什么办法可以解决这个问题,还是不能评论多行宏?
原文由 quant 发布,翻译遵循 CC BY-SA 4.0 许可协议
我正在编写一些大型宏,并认为如果可以向它们添加注释会很好,如下所示:
#define SOME_BIG_MACRO(input)\
SOME_FUNCTION_CALL() \ // this does...
SOME_OTHER_FUNCTION_CALL()
当我运行它时,我得到:
prog.cpp:9:2:错误:程序中出现杂散“\”
有什么办法可以解决这个问题,还是不能评论多行宏?
原文由 quant 发布,翻译遵循 CC BY-SA 4.0 许可协议
3 回答2k 阅读✓ 已解决
2 回答3.9k 阅读✓ 已解决
2 回答3.2k 阅读✓ 已解决
1 回答3.2k 阅读✓ 已解决
1 回答2.7k 阅读✓ 已解决
3 回答3.4k 阅读
1 回答1.6k 阅读✓ 已解决
除了宏的最后一行,没有办法在宏中使用
// comments
。正如 Paul R 所建议的,
/* comment */
确实有效,并且似乎是唯一的选择:原因如下。 编程语言 C ++ 标准(我只能访问此草案)指定源文件的物理行可以连接成编译器将看到的逻辑行,方法是使用
\
后跟换行符:这可以在预处理器输出中轻松检查:create
file.cpp
with然后
给
或者
这是编译器看到的(在 Ubuntu 上检查;您的里程可能会有所不同)。
现在,将此规则应用于多行宏,
被预处理器理解为
因为所有
\
和下一个换行符都被忽略了。相似地,
被预处理器视为
然而,
变成两行:
因为第二个
\
后面没有换行符,因此被保留,以及前面没有\
的换行符。这会导致编译错误。尽管
变成一行:
这在语法上是正确的,但宏不完整。一些编译器将此报告为错误,因为这很可能不是程序员的意图。其他的,例如 Ubuntu
cc
,默默地应用标准定义的规则。由于一个宏只能占用一个 逻辑 行(尽管是几行物理行,使用换行符转义机制),因此该行上的任何
// comment
都会导致宏的所有其余部分被忽略。结论:
// comment
只能出现在(多行或单行)宏的末尾,而/* comment */
可以完美地在宏内部使用。