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

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

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

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

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

提前致谢。

4

3 回答 3

18

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

std::string不是 POD,但您可以执行以下操作:

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

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

于 2013-06-09T11:51:51.747 回答
3

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

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

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

void displayinfo(const string& filename) { .... }
于 2013-06-09T11:52:05.200 回答
0

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

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

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

于 2013-06-09T12:00:14.107 回答