Stringify 预处理器使用宏创建带空格的字符串

Stringify preprocesor using macros to create a string with spaces

我正在尝试使用一些宏为我的 GUI 标题创建一个带空格的字符串,我有这个 resource.h:

#define QUOTE(s) #s
#define xstr(s) QUOTE(s)

#define PACKAGE_NAME                            "SoundTest"
#define PACKAGE_VERSION_MAYOR                   1
#define PACKAGE_VERSION_MINOR                   8
#define PACKAGE_VERSION                         xstr(PACKAGE_VERSION_MAYOR.PACKAGE_VERSION_MINOR)
#define PACKAGE_STRING                          xstr(PACKAGE_NAME PACKAGE_VERSION)

以上在我的 window 标题中产生了这个输出:"SoundTest" "1.8"(带引号); 我想要这个输出:SoundTest 1.8(不带引号)。有什么想法吗?

这行得通吗,虽然它不是最好的解决方案?

#define PACKAGE_NAME                            SoundTest
#define PACKAGE_VERSION_MAYOR                   1
#define PACKAGE_VERSION_MINOR                   8
// not using this actually
#define PACKAGE_VERSION                         xstr(PACKAGE_VERSION_MAYOR.PACKAGE_VERSION_MINOR) 
#define PACKAGE_STRING                          xstr(PACKAGE_NAME PACKAGE_VERSION_MAYOR.PACKAGE_VERSION_MINOR)

PACKAGE_NAME 中已有引号:

#define PACKAGE_NAME        "SoundTest"

因此,如果您对 PACKAGE_NAME 进行字符串化,您也会对引号进行字符串化,从而得到类似 "\"SoundTest\"" 的结果。 (请记住,C 预处理器只处理字符。它不理解 C 数据类型。)

幸运的是,C 允许您通过一个接一个地编写字符串文字来连接它们,因此,例如,"SoundTest" " " "1.8" 是一个字符串文字,就像它被写成 "SoundTest 1.8" .您可以在这里利用它:

#define PACKAGE_VERSION     xstr(PACKAGE_VERSION_MAYOR.PACKAGE_VERSION_MINOR)
#define PACKAGE_STRING      PACKAGE_NAME " " PACKAGE_VERSION