"Define"宏串联和_TEXT

"Define" Macro Concatenation and _TEXT

本文关键字:TEXT Define      更新时间:2023-10-16

在c++(ms编译器)中有没有连接#define宏的方法?

我有这样的现有代码:

#define LOG_FILENAME _TEXT("VendorBlaBlaDriver.log")
#define REGISTRY_FILENAME _TEXT("VendorBlaBlaDriver")
#define VENDOR_NAME _TEXT("VendorBlaBla")

我想做以下事情:

#define NAME_PART1 "VenorBlaBla"
#define NAME_PART2 "Driver"
#define LOG_FILENAME _TEXT(NAME_PART1 NAME_PART2 ".log")
#define REGISTRY_FILENAME _TEXT(NAME_PART1 NAME_PART2)
#define VENDOR_NAME _TEXT(NAME_PART1)

但编译器给了我一个错误:

error C2308: concatenating mismatched strings

有什么方法可以做到这一点吗?问题是这是一个组件,我想稍后指定-D选项进行编译。我不想在源代码中存储NAME_PART1和NAME_PART2。

不能两次应用_TEXT宏。或者在多个字符串上,但您可以将结果连接起来。即

#define LOG_FILENAME _TEXT(NAME_PART1) _TEXT(NAME_PART2) _TEXT(".log")

不过,你真的不该麻烦。_TEXT宏是在世纪之交使用的,当时仍然存在非Unicode平台。今天我们只写#define NAME_PART1 L"VenorBlaBla";没有人再销售Windows95软件了。

这是因为_TEXT仅应用于NAME_PART1,而不应用于其他部分,因此应写成:

#define NAME_PART1 "VenorBlaBla"
#define NAME_PART2 "Driver"
#define LOG_FILENAME      _TEXT(NAME_PART1) _TEXT(NAME_PART2) _TEXT(".log")
#define REGISTRY_FILENAME _TEXT(NAME_PART1) _TEXT(NAME_PART2)
#define VENDOR_NAME       _TEXT(NAME_PART1)

不匹配的是_TEXT正在定义一个宽字符串,其中其他字符串仍然是普通字符串。

这不管用吗(手头还没有编译器来试用):

#define LOG_FILENAME _TEXT(NAME_PART1) _TEXT(NAME_PART2) _TEXT(".log")

然后让编译器将这两个字符串连接起来。