我正在一个项目中,我有许多由串联(数字等)形成的常量字符串。如何使用C预处理器将连接字符串转换为宽字符?
例如,我有一个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相同的结果?我宁愿不创建第二个具有全范围标记的字符串,因为我必须为每个标记维护两个宏,这不是很方便,并且可能导致错误。另外,我还需要每个字符串的窄版本,因此不幸的是,使用全宽字符串也不是一种选择。
这很有效,虽然它是一种尴尬的语法,并且有很多开销......但它确实有效,并且我不必维护多个宏。 希望微软会更新它的预处理器来支持更多的C99功能,事情会更简单。 谢谢! – 2010-02-03 15:44:25