Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符串宏/常量转换为宽字符/Unicode_C++_Unicode_Wchar_C Preprocessor - Fatal编程技术网

C++ 将字符串宏/常量转换为宽字符/Unicode

C++ 将字符串宏/常量转换为宽字符/Unicode,c++,unicode,wchar,c-preprocessor,C++,Unicode,Wchar,C Preprocessor,我有一个Unicode Win32应用程序,它使用第三方库,其中一些库以#定义(窄)字符串的形式为其版本信息提供常量。例如,具有以下功能: #define PNG_LIBPNG_VER_STRING "1.5.4" #define PNG_HEADER_VERSION_STRING \ " libpng version 1.5.4 - July 7, 2011\n" 为了便于版本跟踪,我将各种静态链接库的版本信息添加到我的About框中,似乎将这个常量转换为宽字符串很简单 我的第一次尝试是文

我有一个Unicode Win32应用程序,它使用第三方库,其中一些库以#定义(窄)字符串的形式为其版本信息提供常量。例如,具有以下功能:

#define PNG_LIBPNG_VER_STRING "1.5.4"
#define PNG_HEADER_VERSION_STRING \
 " libpng version 1.5.4 - July 7, 2011\n"
为了便于版本跟踪,我将各种静态链接库的版本信息添加到我的About框中,似乎将这个常量转换为宽字符串很简单

我的第一次尝试是文本(PNG\u标题\u版本\u字符串),但是失败了

#define __TEXT(quote) L##quote
。。当然,LPNGHEADER\u VERSION\u字符串不存在

因此,我尝试了几种双重包装宏的组合,以及各种各样的技巧,试图将L前缀添加到宏化常量中,但未能成功。我错过了一些简单的东西吗?您将如何处理:

#define VERSIONSTR "Test V1.2.3"
const char* ver= VERSIONSTR;
const wchar* wver = _T(VERSIONSTR); // fails, should be L"Test V1.2.3"
#define VERSIONSTRW _T(VERSIONSTR);  // fails also
以编程方式,无需简单地添加重复的L“Test V1.2.3”并使其与第三方库保持同步

我知道如果我在构建Unicode,我可以在运行时转换它,但我想肯定有一种快速的方法可以重新定义这个常量

---更新---


我对我的include结构做了一些非常愚蠢的事情,因此错过了剧情。修复了允许双定义包装器正常工作的问题。我很笨。

诀窍是使用两个宏。展开宏时,参数在被替换到替换列表中之前将进行宏展开。因此,
widden(VERSIONSTR)
变成了
widden2(“测试V1.2.3”)


你在用什么编译器
#define VERSIONSTRW(VERSIONSTR)
在VC++2008.VS2003中对我有效。我知道它很旧,但它现在是必需的。也许这只是我的编译器中的一个bug?我以前已经试过了。VS失败,错误与单包装前相同。wchar*str=extended(VERSIONSTR)导致错误C2065:“LVERSIONSTR”:未声明的标识符请参阅我的更新。双宏技巧在VS2003中工作得很好(稍后我假设)。我的愚蠢使我看不到显而易见的东西。
#define WIDEN(quote) WIDEN2(quote)
#define WIDEN2(quote) L##quote

#define VERSIONSTR "Test V1.2.3"
#define VERSIONSTRW WIDEN(VERSIONSTR)