我必须制作两个名称不同的项目。两个项目都将共享相同的代码。
所以我开始将调用旧名称的地方替换为名为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:连接不匹配的字符串
是否可以使用任何预处理器魔法来克服它?
答案 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_NAME
和APP_NAME_W
,一个窄,一个宽。在这种情况下使用适合的任何一个。
答案 3 :(得分:0)
你不能混合窄弦和宽弦。但是,如果你一直使用_T(),那么一切都会起作用。确保两个项目和所有编译单元具有相同的UNICODE设置,它控制_T()是“或”L“”。