传递字符串的c ++非POD警告?

时间:2013-06-09 11:49:39

标签: c++ string warnings printf

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

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

网上没有任何内容可以解释警告的含义。

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

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

提前致谢。

3 个答案:

答案 0 :(得分:12)

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

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

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

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

答案 1 :(得分:3)

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

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

顺便说一句,请注意,如果您不打算修改或复制输入字符串,则应通过const引用:

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

答案 2 :(得分:0)

我严重怀疑网络是否会沉默。也许你看错了地方或者使用了nad keyworrs。

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

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