【发布时间】:2016-08-09 12:34:12
【问题描述】:
在我测试过的所有Visual C++版本下的MFC中,下面的代码都能编译运行;
CString A = "String A", B;
B.Format("The value of A is %s", A);
但会产生警告
C6284, Object passed as _Param_(2) when a string is required in call to
'ATL::CStringT<char,StrTraitMFC<char,ATL::ChTraitsCRT<char> > >::Format'
Actual type: 'class ATL::CStringT<char,class StrTraitMFC<char,class ATL::ChTraitsCRT<char> > >'.
查看 CString 的源代码及其 CStringT 的祖先 CSimpleStrT,同时有一个转换运算符可以有效地转换为 char*,如下所示;
operator PCXSTR() const throw()
{
return( m_pszData );
}
数据缓冲区似乎也是类中的第一个数据元素,通过调试器下的执行跟踪表明没有调用转换运算符,代码纯粹基于类布局工作。
虽然原始代码可以很容易地重写以避免上述情况,但它是否有必要并且可能会被未来的 MFC 更新破坏?涉及的代码库部分主要是第 3 方,我宁愿避免在没有充分理由的情况下更改它。
【问题讨论】:
标签: c++ mfc variadic-functions