如何创建一个预处理字符串,使其适用于窄字符和宽字符?

5

我需要制作两个不同名称的项目,这两个项目将共享相同的代码。

因此,我开始将调用旧名称的位置替换为名为 APP_NAME 的预处理器,该预处理器位于 stdafx.h 中。

在 stdafx.h 中,我添加了以下内容:

#define APP_NAME _T("My name") 

当我找到以下这样的代码时

function(parm1,_T("My old name have a error"));

我想要替换为。
function(parm1, APP_NAME _T(" have a error"));

但是,在宽字符(T("x") 或 L"")与纯窄字符("")混合时会出现许多错误。

错误 C2308:连接不匹配的字符串

是否有可能进行任何预处理器魔法来克服这个问题?

4个回答

2
也许问题在于您定义了一个宏 APP_NAME,但后来使用了 NAME。如果这不是真正的问题,那么您只需要始终使用 _T("..."),以便所有字符串都将正确前缀(假设 _T 在您的环境中仅扩展到宽或窄限定字符串)。

2
_T移动到使用宏的位置,因为那里知道正确的编码方式。
#define APP_NAME "My name"
function(parm1, _T(APP_NAME) _T(" have a error"));

但实际上你不应该这样做,这是Visual C++ 2010中的一个bug。C++0x要求(第[lex.string]节):
在翻译阶段6(2.2)中,相邻的字符串字面值将被连接起来。如果两个字符串字面值具有相同的编码前缀,则生成的连接字符串字面值具有该编码前缀。如果一个字符串字面值没有编码前缀,则将其视为具有与另一个操作数相同的编码前缀的字符串字面值。如果UTF-8字符串字面值标记与宽字符串字面值标记相邻,则程序无效。任何其他连接都在实现定义行为下有条件支持。[注意:此连接是一种解释,而不是转换。因为解释发生在翻译阶段6之后(在从适当字符集中的每个字符翻译成一个值之后),所以字符串字面值的初始原始性对连接的解释或良好形式性没有影响。 —— 结束说明]

0

有一个APP_NAME和一个APP_NAME_W,一个窄的,一个宽的。在相应的上下文中使用适当的那个。


0

您不能混合使用窄字符串和宽字符串。但是,如果您始终使用 _T(),则一切都将正常工作。请确保所有项目和编译单元的UNICODE设置相同,以控制 _T() 是 "" 还是 L""。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接