【问题标题】:c++ non-POD warning for passing a string?传递字符串的c ++非POD警告?
【发布时间】:2013-06-09 11:49:39
【问题描述】:
void displayinfo(string &filename)
{
printf("%s% 38s\n", "Filename:", filename);
...

警告:“std::string”类型的非 POD 对象作为变量参数传递给函数“std::printf(const char*, ...)”。

没有任何在线解释该警告的含义。

我如何让 printf 写这个(假设文件名 = test.txt):

文件名:(文件名右对齐)test.txt

提前致谢。

【问题讨论】:

    标签: c++ string warnings printf


    【解决方案1】:

    解释很简单:只有 POD(普通旧数据结构)可以作为参数传递给可变参数函数(不是可变参数函数模板,只是使用省略号的简单可变参数函数)。

    std::string 不是 POD,但你可以这样做:

    printf("%s% 38s\n", "Filename:", filename.c_str());
    //                                       ^^^^^^^^
    

    c_str() member functionconst char* 返回到封装的 C 字符串。

    【讨论】:

    • @user2369405:很高兴它有帮助
    【解决方案2】:

    printf%s 格式说明符一起使用时,需要一个指向 char 的指针。您可以通过c_str() 方法从std::string 获取它:

    printf("%s% 38s\n", "Filename:", filename.c_str());
    

    顺便说一句,如果你不打算修改或复制输入字符串,你应该通过const参考:

    void displayinfo(const string& filename) { .... }
    

    【讨论】:

      【解决方案3】:

      我严重怀疑网络会保持沉默。也许您查看了错误的地方或使用了 nad keyworrs。

      基本规则很简单,将非 POD 作为 ... 参数传递是未定义的行为。除非您的实现定义了一些行为并且它与您的任务相匹配,否则不要这样做。

      特别是对于 printf 系列,格式字符串需要特定类型才能传递,即使传递 POD 有效,您也打破了这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-09-30
        • 2013-09-13
        • 1970-01-01
        • 2013-04-11
        • 2012-04-09
        • 2019-07-28
        相关资源
        最近更新 更多