使用CString :: Format时如何防止C6284?

sor*_*rin 6 compiler-warnings visual-c++

以下代码在使用MSVC 2008 编译时生成警告C6284/analyze:在调用函数时需要字符串时,对象作为参数'%s'传递.

 CString strTmp, str;
 str = L"aaa.txt"
 strTmp.Format (L"File: %s", str);
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个不需要的好解决方案 static_cast

Fra*_*ack 6

微软介绍的CString的带有可变参数函数的用法在这里:

CString  kindOfFruit = "bananas";
int      howmany = 25;
printf_s( "You have %d %s\n", howmany, (LPCTSTR)kindOfFruit ); 
Run Code Online (Sandbox Code Playgroud)

作为替代方法,您还可以使用该方法PCXSTR CString::GetString() const;尝试修复警告:

CString strTmp, str;
str = L"aaa.txt"
strTmp.Format (L"File: %s", str.GetString());
Run Code Online (Sandbox Code Playgroud)

  • 您可以将两者都用于您的情况,但它们对读者有不同的含义。`GetBuffer()` 返回一个字符串缓冲区,该缓冲区允许对 `CString` 对象进行直接修改(不是 `const`),而 `GetString()` 返回一个用于只读访问的 `const` 缓冲区。 (2认同)

Tim*_*sch 5

CString 的设计缺陷之一是它具有隐式转换功能,这LPCTSTR使得警告没有那么有意义。但无论如何,如果你查看Microsoft 文档,他们实际上在自己的示例中使用了强制转换。我真的不认为有必要static_cast在这里避免 a ,事实上我会欢迎它,因为它确实使隐式转换更加明确,因此更容易发现。