gpt4 book ai didi

c++ - 使用 Unicode 字符串文字 Stringify 宏

转载 作者:可可西里 更新时间:2023-11-01 17:44:32 25 4
gpt4 key购买 nike

我正在使用这个预处理器宏来“字符串化”并轻松地从定义解析函数返回:

#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";
}
}

但这给了我错误:

error C2308: concatenating mismatched strings

error C2440: 'return' : cannot convert from 'const char [12]' to '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 L""

这将连接两个 L"…" 字符串。另一种更简单的解决方案是不连接空字符串:

#define STRINGIFY_RETURN_WIDE(x) case x: return L#x

尚不清楚附加空字符串是否有任何好处。


作为Robert Prévostcomment 中注明,这不适用于 G++ 和 Clang++,虽然它似乎适用于 Vinzenz使用他的编译器(Microsoft Visual Studio 2013)。

问题在于预处理器将其输入标记化,宽字符串文字 L"..." 都是一个标记,但上面的宏试图生成标记 L 和 "..."`,导致问题:

xx11.cpp:5:49: error: ‘L’ was not declared in this scope
#define STRINGIFY_RETURN_WIDE(x) case x: return L#x
^
xx11.cpp:11:9: note: in expansion of macro ‘STRINGIFY_RETURN_WIDE’
STRINGIFY_RETURN_WIDE(MY_DEFINE_1);

有一个解决方法:

#define MY_DEFINE_1 1
#define MY_DEFINE_2 2
#define MY_DEFINE_3 3

#define LSTR(x) L ## x
#define STRINGIFY_RETURN_WIDE(x) case x: return LSTR(#x)

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";
}
}

在带有 GCC 6.2.0 的 Mac OS X 10.11.6 上检查。

关于c++ - 使用 Unicode 字符串文字 Stringify 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39403121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com