如何使预处理器字符串既窄又宽

时间:2011-04-26 00:29:56

标签: c++ string c-preprocessor

我必须制作两个名称不同的项目。两个项目都将共享相同的代码。

所以我开始将调用旧名称的地方替换为名为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 个答案:

答案 0 :(得分:2)

问题可能是您定义了一个宏APP_NAME,但之后又使用了NAME。如果这不是真正的问题,那么你只需要一致地使用_T(“...”),这样所有字符串都将正确地加上前缀(假设_T扩展为环境中的宽或窄限定字符串)

答案 1 :(得分:2)

_T移动到使用宏的位置,因为这是正确编码的位置。

#define APP_NAME "My name"
function(parm1, _T(APP_NAME) _T(" have a error"));

但实际上你不应该这样做,这是Visual C ++ 2010中的一个错误.C ++ 0x要求([lex.string]}部分:

  

在翻译阶段6(2.2)中,连接相邻的字符串文字。如果两个字符串文字具有相同的 encoding-prefix ,则生成的连接字符串文字具有 encoding-prefix 如果一个字符串文字没有 encoding-prefix ,则将其视为与另一个操作数相同的 encoding-prefix 的字符串文字。如果UTF-8字符串文字标记与宽字符串文字标记相邻,则程序格式错误。实现定义的行为有条件地支持任何其他连接。 [注意:这种连接是一种解释,而不是转换。因为解释发生在翻译阶段6(在文字中的每个字符都被翻译成适当字符集的值之后),字符串文字的初始原始性对连接的解释或良好形成没有影响。 - 结束记录]

答案 2 :(得分:0)

拥有APP_NAMEAPP_NAME_W,一个窄,一个宽。在这种情况下使用适合的任何一个。

答案 3 :(得分:0)

你不能混合窄弦和宽弦。但是,如果你一直使用_T(),那么一切都会起作用。确保两个项目和所有编译单元具有相同的UNICODE设置,它控制_T()是“或”L“”。