我正在编写一些大的宏,并认为如果我可以为它们添加注释会很好,就像这样:
#define SOME_BIG_MACRO(input)\
SOME_FUNCTION_CALL() \ // this does...
SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)
当我运行这个时,我得到:
prog.cpp:9:2:错误:在程序中迷路'\'
有什么方法可以解决这个问题,还是不可能对多行宏进行评论?
Ale*_*ukh 21
// comments除了宏的最后一行之外,没有办法在宏中使用.
正如Paul R所暗示的那样,/* comment */确实有效并且似乎是唯一的选择:
#define SOME_BIG_MACRO(input)\
SOME_FUNCTION_CALL() /* this does... */ \
SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)
原因如下.编程语言C++标准(我只能访问此草案)指定源文件的物理行可以连接成编译器将使用\后跟换行符所看到的逻辑行:
删除反斜杠字符()后面紧跟一个新行字符的每个实例,拼接物理源代码行以形成逻辑源代码行.只有任何物理源线上的最后反斜杠才有资格成为此类拼接的一部分.
这可以在预处理器输出中轻松检查:create file.cppwith
pri\
ntf ("Hell\
o world"\
);
Run Code Online (Sandbox Code Playgroud)
然后
cpp file.cpp
Run Code Online (Sandbox Code Playgroud)
给
printf ("Hello world");
Run Code Online (Sandbox Code Playgroud)
要么
printf
("Hello world");
Run Code Online (Sandbox Code Playgroud)
这是编译器看到的(在Ubuntu中检查;您的里程可能会有所不同).
现在,将此规则应用于多行宏,
#define SOME_BIG_MACRO(input)\
SOME_FUNCTION_CALL() \
SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)
被预处理器理解为
#define SOME_BIG_MACRO(input) SOME_FUNCTION_CALL() SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)
因为\忽略了所有和下一个换行符.
同样的,
#define SOME_BIG_MACRO(input)\
SOME_FUNCTION_CALL() /* this does... */ \
SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)
被预处理器视为
#define SOME_BIG_MACRO(input) SOME_FUNCTION_CALL() /* this does... */ SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)
然而,
#define SOME_BIG_MACRO(input)\
SOME_FUNCTION_CALL() \ // this does...
SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)
变成两行:
#define SOME_BIG_MACRO(input) SOME_FUNCTION_CALL() \ // this does...
SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)
因为第二个\没有后跟换行符因此被保留,以及换行符之前没有换行符\.这会导致编译错误.
而
#define SOME_BIG_MACRO(input)\
SOME_FUNCTION_CALL() // this does... \
SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)
成为一条线:
#define SOME_BIG_MACRO(input) SOME_FUNCTION_CALL() // this does... SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)
这在语法上是正确的,但宏是不完整的.一些编译器将此报告为错误,因为很可能这不是程序员的意图.其他人,比如Ubuntu cc,默默地应用标准定义的规则.
由于宏只能占用一条逻辑行(尽管有几条物理行,使用换行符转义机制),// comment因此该行中的任何一行都会导致忽略宏的所有其余部分.
结论:a // comment只能出现在(多行或单行)宏的末尾,而/* comment */完全可以在宏内部使用.
行注释 // 不行,只能阻止注释 /* ... */ 例如
#define SOME_BIG_MACRO(input)\
SOME_FUNCTION_CALL() /* this does... */ \
SOME_OTHER_FUNCTION_CALL()
Run Code Online (Sandbox Code Playgroud)