“定义”宏连接和_TEXT

时间:2011-06-03 09:45:57

标签: c++

在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。

3 个答案:

答案 0 :(得分:3)

您无法两次应用_TEXT宏。或者在多个字符串上,但您可以连接结果。即

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

然而,你真的不应该打扰。 _TEXT宏在世纪之交使用,当时还有非Unicode平台。今天我们写#define NAME_PART1 L"VenorBlaBla";没有人再销售Windows 95软件了。

答案 1 :(得分:1)

这是因为_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正在定义一个宽字符串,而其他字符串仍然是普通字符串。

答案 2 :(得分:1)

这不会起作用(没有编译器可以试用它):

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

然后让编译器连接两个字符串。