在c++宏中输出反斜杠

Outputing backslash in a C++ macro

本文关键字:输出 c++      更新时间:2023-10-16

是否有可能在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++中可能吗?

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

每个紧跟着换行字符的反斜杠字符()实例都被删除,将物理源行拼接到形成逻辑源行。只有最后一个反斜杠源线应符合作为这种接头的一部分的条件。如果像的语法匹配的字符序列产生Universal-character-name时,其行为未定义。一个非空且不以换行结束的源文件字符,或者以紧接在其前面的新行字符结束在任何此类拼接发生之前,应使用反斜杠字符将被处理,就好像附加了一个额外的换行字符文件。

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

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

然而,在我的研究中,我发现这可能不是你要处理的最重要的事情。正如millsj刚才所评论的,在ENUM_BEGIN中输出#会有问题。参见#define宏中的#符号转义?.