在将应用程序从VisualStudio 2005迁移到VisualStudio 2015时,我们在某些代码中发现了一种不同的行为,当使用VS2015构建该代码时,它会连接CString实例.
所以,我已经创建了一个简单的Win32控制台应用程序来演示这个问题.
控制台应用程序(使用MFC作为共享dll和Unicode charachter集)执行这个简单的功能:
void f()
{
CString x( '\0' );
CString r( 'a' );
r += x;
CString rr( 'a' );
rr = rr + x;
int rSize = r.GetLength();
int rrSize = rr.GetLength();
assert( rSize == rrSize ); // This assert fires when compiled and run
// under Visual Studio 2015!
}
Run Code Online (Sandbox Code Playgroud)
它表明,当包含'\ 0'字符的CString连接到另一个CString实例时,使用'+ ='或使用'+'会导致不同的结果!
当使用'+ ='时,计算结果的大小,计算所有字符,直到第一个'\ 0'...因此最终大小为1!
相反,当使用运算符'+'时,结果CString大小为2,即连接实例大小的总和!
在VisualStudio 2005中,结果大小始终是连接实例大小的总和!
几个星期前我向微软提交了一个错误,但到目前为止我还没有得到这些人的回答.
我的问题:
1.有人偶然发现了MCF库中的这个错误吗?
你是如何解决这个错误的?我们正在考虑禁止使用+ =运算符或者用自定义类替换CString类,但所有这些对我来说都是"有点"侵入性的.