在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。
答案 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")
然后让编译器连接两个字符串。