3

是否可以在 C++ 中编写一个宏,其AFTER扩展将输出一个反斜杠符号?

现在我正在使用代码:

#define SOME_ENUM(XX) \
    XX(FirstValue,) \
    XX(SecondValue,) \
    XX(SomeOtherValue,=50) \
    XX(OneMoreValue,=100) \

但我想写一个宏,它会生成上面的代码,所以我希望能够写:

ENUM_BEGIN(name) // it should output: #define SOME_ENUM(XX) \
ENUM(ONE)        // it should output: XX(ONE,) \
//...

但是我无法编写像 一样的宏ENUM_BEGIN,因为它应该扩展为最后带有反斜杠的东西。在 C++ 中可能吗?

4

2 回答 2

1

不,这是不可能的。与此相关的是 §2.2.1,ISO/IEC 14882:2011(E) 中描述的翻译阶段 2:

每个反斜杠字符 () 的实例后面紧跟一个换行符被删除,拼接物理源代码行以形成逻辑源代码行。只有任何物理源行上的最后一个反斜杠才有资格成为此类接头的一部分。结果,如果生成了与通用字符名称的语法匹配的字符序列,则行为未定义。如果源文件不为空且不以换行符结尾,或者在任何此类拼接发生之前以换行符结尾且紧接在反斜杠字符之前,则应将其视为附加的 new-行字符被附加到文件中。

基本上会发生的是\\\n\n物理上在源中,而不是转义),将被视为一个\字符,然后是一个线拼接。剩下的\很可能会导致语法错误(在某些情况下它是合法的,但我目前没有看到任何情况),并且在随后的翻译阶段不被视为线拼接(线拼接仅发生在阶段#2 )。

于 2013-03-26T21:02:28.220 回答
0

我还没有找到任何文档,但我认为你可以这样做\\并且你会生成一个反斜杠。

然而,在我的研究中,我发现这可能不是你必须处理的最重要的事情。正如millsj 刚刚评论的那样,您#在ENUM_BEGIN 中输出时会遇到问题。请参阅在 #define 宏中转义 # 符号?.

于 2013-03-26T19:07:33.067 回答