【问题标题】:A strange macro definition c++一个奇怪的宏定义 c++
【发布时间】:2016-06-10 02:45:58
【问题描述】:

我在编译开源项目时遇到了这个错误:

/usr/local/include/dbus-1.0/dbus/dbus-protocol.h:459:126: error: invalid suffix on literal; C++11 requires a space between literal and identifier [-Wreserved-user-defined-literal]
#define DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE "<!DOCTYPE node PUBLIC \""DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIER"\"\n\""DBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER"\">\n"

通过更改上面的宏定义来解决这个问题:

-#define DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE "<!DOCTYPE node PUBLIC \""DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIER"\"\n\""DBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER"\">\n"
+#define DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE "<!DOCTYPE node PUBLIC \"" DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIER "\"\n\"" DBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER "\">\n

令我困惑的是#define 本身:

#define A "" B "" C ""

这是什么? 我们可以这样使用#define吗?

【问题讨论】:

    标签: c++ macros string-concatenation


    【解决方案1】:

    如果你使用:

    #define A "Foo" B "Bar" C "Baz"
    

    A 扩展为一个字符串,其值为三个硬编码字符串和两个由宏 BC 定义的字符串的串联。

    如果B#defined 作为"_10_" 并且C#defined 作为"_XYZ",那么A 扩展为

    "Foo" "_10_" "Bar" "_XYZ" "Baz"
    

    相当于

    "Foo_10_Bar_XYZBaz"
    

    【讨论】:

      【解决方案2】:

      您可以使用#define 定义一个包含任何内容的宏。

      当使用宏时,这是否会导致可以编译的有效 C++ 代码完全不同。

      【讨论】:

      • 我以为 dbus_protocol.h 试图定义 3 个宏,不是吗?
      • 不,DBUS_INTROSPECT_1_0_XML_DOCTYPE_DECL_NODE 是一个扩展为 "&lt;!DOCTYPE node PUBLIC \"" DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIER "\"\n\"" DBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER "\"&gt;\n" 的宏。这很好,只要 DBUS_INTROSPECT_1_0_XML_PUBLIC_IDENTIFIERDBUS_INTROSPECT_1_0_XML_SYSTEM_IDENTIFIER 是扩展为空或字符串文字的宏,因为相邻的字符串文字合并在一起。
      • @MilesBudnek 如果空格被遗漏,编译器应该没问题
      猜你喜欢
      • 2016-03-07
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      相关资源
      最近更新 更多