C++非POD警告:传递字符串?

9
void displayinfo(string &filename)
{
printf("%s% 38s\n", "Filename:", filename);
...

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

网上没有任何解释这个警告的含义。

如果文件名为test.txt,您应该如何使printf写出以下内容:

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

提前感谢。

3个回答

19

解释很简单:只有POD(Plain Old Data结构)可以作为可变参数函数的参数传递(不包括可变参数函数模板,仅限使用省略号的普通可变参数函数)。

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

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

c_str()成员函数返回一个指向封装的C字符串的const char*


3

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

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

作为一种附带说明,需要注意的是,如果您不打算修改或复制输入字符串,则应该通过const引用传递:
void displayinfo(const string& filename) { .... }

0

我真的怀疑网络会保持沉默。也许你看错了地方或使用了错误的关键词。

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

特别是对于printf系列,格式字符串需要传递特定类型,即使传递POD也会破坏它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接