具有尾随注释的多行预处理器宏

Ayb*_*gür 6 c c++ gcc g++ c-preprocessor

我想定义以下普通的宏:

#define MY_ENUM enum MyEnum{ \
    myVal0, \ //Describes this situation
    myVal2  \ //Describes that situation
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,这不起作用error: stray ‘\’ in program.反斜杠导致后甚至是一些空格warning: backslash and newline separated by space.正如这个答案所指出的那样,反斜杠必须是该行的最后一个字符.这个答案指出在处理注释之前会发生行拼接.之所以选择这个订单,对我来说绝对没有意义; 我可以想象这样做的唯一原因是允许多行评论,如下所示:

//This is a comment which \
follows in the next line
Run Code Online (Sandbox Code Playgroud)

这看起来非常危险,因为这样的事情可能只会吞噬下一行中的任何代码.相反的顺序,即在拼接线之前用单个空格替换每个注释听起来像是一个更明智的选择.有人可以解释为什么做出这个选择吗?

我可以通过以下方法解决原始问题:

#define MY_ENUM enum MyEnum{ \
    myVal1, /*Describes this situation*/ \
    myVal2  /*Describes that situation*/ \
}
Run Code Online (Sandbox Code Playgroud)

我做这个笨拙的枚举宏定义的目的是这个宏必须在c ++(由于Qt绝对必须是一个类成员)和c之间共享.定义一个这样的宏看起来像是我的唯一解决方案,但上面的解决方案看起来很难看,我绝对不想让枚举取消注释.我接近这个问题了吗?

πάν*_*ῥεῖ 5

问题是 C 预处理器只是在\\命中并继续时添加另一个行结束字符。

\n

//评论中你不能这样做。不接受该\\角色继续评论(无论如何,它应该显示为一行)。

\n
\n

解决办法是\xe2\x80\x94你自己发现\xe2\x80\x94使用/* */注释风格。

\n

  • 首先进行行拼接,将整个宏定义(包括注释)放在一行上...因此第一个“//”注释掉了宏定义的其余部分。使用“/* */”注释,注释可以在行尾之前关闭,这就是该样式仍然有效的原因。 (2认同)