代码之家  ›  专栏  ›  技术社区  ›  Wojciech Danilo

在C++宏中输出反斜杠

  •  3
  • Wojciech Danilo  · 技术社区  · 12 年前

    在C++中有可能写一个宏吗 之后 扩展会输出反斜杠吗?

    现在我正在使用一个代码:

    #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++中可能吗?

    2 回复  |  直到 12 年前
        1
  •  1
  •   Nathan Ernst    12 年前

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

    紧接着一个新行字符的反斜杠字符()的每个实例都被删除,将物理源行拼接到 形成逻辑源线。只有任何物理上的最后一个反斜杠 源线应有资格成为此类拼接的一部分。如果,作为 结果,一个与 生成通用字符名,行为未定义。A. 不为空且不以新行结尾的源文件 字符,或以紧跟在前的换行符结尾 在进行任何此类拼接之前使用反斜杠字符,应 被处理,就好像附加了一个新的换行符 文件。

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

        2
  •  0
  •   Community CDub    8 年前

    我还没有找到任何文件,但我想你可以这样做 \\ 然后你会生成一个反斜杠。

    然而,在我的研究中,我发现这可能不是你必须面对的最大问题。正如millsj刚刚评论的那样,输出 # 在您的ENUM_BEGIN中。看见 Escaping a # symbol in a #define macro? .