【发布时间】:2017-01-17 02:32:05
【问题描述】:
我正在使用这个预处理器宏来“字符串化”并轻松地从定义解析函数返回:
#define STRINGIFY_RETURN(x) case x: return #x ""
它在 MBSC 环境中使用普通字符串文字就像一个魅力。示例:
#define MY_DEFINE_1 1
#define MY_DEFINE_2 2
#define MY_DEFINE_3 3
const char* GetMyDefineNameA(unsigned int value)
{
switch(value)
{
STRINGIFY_RETURN(MY_DEFINE_1);
STRINGIFY_RETURN(MY_DEFINE_2);
STRINGIFY_RETURN(MY_DEFINE_3);
default: return "Unknown";
}
}
但是我不得不越来越多地切换到 Unicode 兼容性,所以我不得不重写这个函数来返回 Unicode 字符串,这些字符串需要在字符串文字前面加上 L 前缀。所以我尝试了:
#define STRINGIFY_RETURN_WIDE(x) case x: return #x L""
const wchar_t* GetMyDefineNameW(unsigned int value)
{
switch(value)
{
STRINGIFY_RETURN_WIDE(MY_DEFINE_1);
STRINGIFY_RETURN_WIDE(MY_DEFINE_2);
STRINGIFY_RETURN_WIDE(MY_DEFINE_3);
default: return L"Unknown";
}
}
但这给了我错误:
错误 C2308:连接不匹配的字符串
错误 C2440: 'return' : 无法从 'const char [12]' 转换为 'const wchar_t *
我也试过了:
#define STRINGIFY_RETURN_WIDE(x) case x: return L #x ""
#define STRINGIFY_RETURN_WIDE(x) case x: return #x "" L
但无论如何,我无法让它工作。我对此一无所知,似乎无法找到解决方案。
如果有人能展示执行此宏的正确方法,以便它解析为 Unicode 字符串文字,我将不胜感激。
更新:
#define STRINGIFY_RETURN_WIDE(x) case x: return L#x ""
不会抛出 C2440 错误,但它仍然给我 C2308。
更新 2:
我正在使用 Microsoft Visual Studio 2013
【问题讨论】:
-
您应该打印出预处理文件以查看编译器生成的确切内容,然后从那里开始工作。
-
你不只是想要:#define STRINGIFY_RETURN_WIDE(x) case x: return L#x ""
-
@TimBeaudet 我刚试过,它也给了我 C2308,但 C2440 错误消失了:/
-
这适用于 clang++:#define STRINGIFY_RETURN_WIDE(x) case x: return L""#x
-
连接空字符串有什么好处?我认为
return L#x应该足够了。
标签: c++ c macros c-preprocessor stringification