【问题标题】:Warning C4477 'wprintf_s' : format string '%s' requires an argument of type 'wchar_t *'警告 C4477“wprintf_s”:格式字符串“%s”需要“wchar_t *”类型的参数
【发布时间】:2020-01-18 08:45:42
【问题描述】:

当我编译我的 C++ 项目时,我收到以下警告消息:

警告 C4477“wprintf_s”:格式字符串“%s”需要类型为“wchar_t *”的参数,但可变参数 1 具有类型 std::basic_string<wchar_t,std::char_traits<wchar_t>,std::allocator<wchar_t>>

错误是调用时,

wstring(featureList)

下面是sn-p的代码:

CString featureList;

MyLog(L"featureList1.Replace(restoken + L\"; \", L\"= 1; \") list : %s",wstring(featureList));

如下所示,当我使用 c_str() 进行投射时,警告就解决了。

wstring(featureList).c_str()

我可以继续进行此修复吗?

【问题讨论】:

  • 使用 %hs 传递一个 8 位编码的字符串。
  • @HansPassant:那是一种不幸的格式;固定。
  • @MSalters,该建议与问题的格式没有任何关系。 %hs 只是避免了跳过 wstring 转换循环,他可以直接传递 CString。
  • @HansPassant:这不是假设CStringCStringA 而不是CStringW 吗? %s 始终与 CString 一起使用。
  • 如果它实际上是一个 CStringW 那么他还有一个理由不使用 wstring。

标签: c++ visual-studio c++11


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多