一个奇怪的宏定义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 扩展为一个字符串,其值是三个硬编码字符串和两个由宏 BC.

定义的其他字符串的串联

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

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

相当于

"Foo_10_Bar_XYZBaz"