我正在做一个项目,我有许多由连接(数字等)形成的常量字符串。
例如,我有一个LOCATION
宏,它可以格式化__FILE__
并__LINE__
转换成一个字符串,当打印消息或错误时,我可以使用它来了解我在代码中的位置:
#define _STR(x) # x
#define STR(x) _STR(x)
#define LOCATION __FILE__ "(" STR(__LINE__) ")"
所以,这将格式化一个像“file.cpp(42)”这样的位置。问题是当我尝试将结果转换为宽字符串时:
#define _WIDEN(x) L ## x
#define WIDEN(x) _WIDEN(x)
#define WLOCATION WIDEN(LOCATION)
这适用于 GCC,并导致 L"file.cpp(42)" 被插入到我的代码中。但是,在使用 MSVC++(使用 Visual C++ 2008 Express)尝试此操作时,出现错误:
error: Concatenating wide "file.cpp" with narrow "("
我知道L
前缀只会添加到我的表达式中的第一个术语。我也试过这个:
#define _WIDEN(x) L ## #x
哪个“有效”,但给出的字符串L"\"file.cpp\" \"(\" \"42\" \")\""
显然不是很方便(也不是我想要的),特别是考虑到这个宏与其他宏相比很简单。
所以,我的问题是:我怎样才能让它应用于 MSVC++ 中的整个表达式,这样我才能得到与 GCC 相同的结果?我宁愿不创建具有全范围标记的第二个字符串,因为我必须为每个宏维护两个宏,这不是很方便并且可能导致错误。另外,我还需要每个字符串的窄版本,所以不幸的是,使用全宽字符串也不是一种选择。