一个奇怪的宏定义c++
A strange macro definition c++
我在编译一个开源项目时遇到这个错误:
/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
?
您可以使用 #define
定义包含任何内容的宏。
当使用宏时,这是否会产生可编译的有效 C++ 代码,则完全是另一回事。
如果您使用:
#define A "Foo" B "Bar" C "Baz"
A
扩展为一个字符串,其值是三个硬编码字符串和两个由宏 B
和 C
.
定义的其他字符串的串联
如果 B
是 #define
d 作为 "_10_"
并且 C
是 #define
d 作为 "_XYZ"
,那么 A
扩展为
"Foo" "_10_" "Bar" "_XYZ" "Baz"
相当于
"Foo_10_Bar_XYZBaz"
我在编译一个开源项目时遇到这个错误:
/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
?
您可以使用 #define
定义包含任何内容的宏。
当使用宏时,这是否会产生可编译的有效 C++ 代码,则完全是另一回事。
如果您使用:
#define A "Foo" B "Bar" C "Baz"
A
扩展为一个字符串,其值是三个硬编码字符串和两个由宏 B
和 C
.
如果 B
是 #define
d 作为 "_10_"
并且 C
是 #define
d 作为 "_XYZ"
,那么 A
扩展为
"Foo" "_10_" "Bar" "_XYZ" "Baz"
相当于
"Foo_10_Bar_XYZBaz"