警告C4477'wprintf_s':格式字符串'%s'需要'wchar_t*类型的参数 >当我编译我的C++项目时,我得到下面的警告信息:

警告C4477'wprintf_s':格式字符串'%s'需要'wchar_t*类型的参数 >当我编译我的C++项目时,我得到下面的警告信息:,c++,visual-studio,c++11,C++,Visual Studio,C++11,警告C4477“wprintf_s”:格式字符串“%s”需要类型为“wchar_t*”的参数,但变量参数1的类型为 基本字符串 错误是在调用时 下面是代码片段: CString featureList; MyLog(L"featureList1.Replace(restoken + L\"; \", L\"= 1; \") list : %s",wstring(featureList)); 如下图所示,当我使用c_str进行强制转换时,警告被解决 wstring(featureList).c

警告C4477“wprintf_s”:格式字符串“%s”需要类型为“wchar_t*”的参数,但变量参数1的类型为 基本字符串

错误是在调用时

下面是代码片段:

CString featureList;

MyLog(L"featureList1.Replace(restoken + L\"; \", L\"= 1; \") list : %s",wstring(featureList));
如下图所示,当我使用c_str进行强制转换时,警告被解决

wstring(featureList).c_str()
我可以继续进行此修复吗?

是的,这是正确的。wstring是临时的,但其生命周期仅在wsprintf_返回后结束


作为MSVC++扩展,您还可以完全省略wstring并按原样传递featureList。在标准C++中,这是未定义的行为,但是微软编写了Ctring,以便与自己的编译器一起工作。

使用%HS传递一个8位编码的字符串。@ HANSPASANT:这是一个不幸的格式化;已修复。@mAlters,建议与问题的格式无关。%hs简单地避免了跳过wstring转换环,他可以直接通过CString。@HansPassant:这不是假设CString是CStringA而不是CStringW吗?%s总是使用CString。如果它实际上是CStringW,那么他还有一个不使用wstring的理由。
wstring(featureList).c_str()