【发布时间】:2016-06-07 16:11:12
【问题描述】:
我想定义以下看起来很普通的宏:
#define MY_ENUM enum MyEnum{ \
myVal0, \ //Describes this situation
myVal2 \ //Describes that situation
}
令我惊讶的是,由于error: stray ‘\’ in program,这不起作用。即使是反斜杠后的一些空格也会导致warning: backslash and newline separated by space。正如this answer 指出的那样,反斜杠必须是该行的最后一个字符。 This answer 指出在处理 cmets 之前会发生线拼接。选择这个顺序的原因对我来说完全没有意义;我能想到的唯一原因是允许多行 cmets 如下所示:
//This is a comment which \
follows in the next line
这看起来非常危险,因为这样的事情可能会在尝试时吃掉下一行的任何代码。相反的顺序,即在拼接线之前用单个空格替换每个注释对我来说听起来是一个更明智的选择。有人能解释一下为什么做出这个选择吗?
我可以通过以下方式解决我原来的问题:
#define MY_ENUM enum MyEnum{ \
myVal1, /*Describes this situation*/ \
myVal2 /*Describes that situation*/ \
}
我在做这个尴尬的枚举宏定义时的目的是这个宏必须在 c++(由于 Qt 它绝对必须是类成员)和 c 之间共享。定义这样的宏对我来说似乎是唯一的解决方案,但上述解决方法看起来很难看,我绝对不想让枚举不加注释。我处理这个问题有错吗?
【问题讨论】:
-
请原谅我的天真,但为什么需要枚举宏?我会将枚举定义放入头文件中并包含头文件。
-
你已经描述了你遇到的问题,你已经描述了解决方案。使用
/*...*/cmets。 -
听起来你在问是否可以使用非 C 语法编写 C 代码,因为它看起来更好......这有点奇怪。
-
请注意,即使在拼接之前识别出 cmets,您的代码仍然无法工作: cmets 被替换为空格,因此您的 `` 无论如何都不会是最后一个字符。
-
"...拼接发生在处理 cmets 之前。这个顺序对我来说绝对没有意义;" --> 毕竟它被称为pre-处理器,因为它处理输入在评估它的C C++代码。
标签: c++ c gcc g++ c-preprocessor