void displayinfo(string &filename)
{
printf("%s% 38s\n", "Filename:", filename);
...
警告:将非POD类型的“std::string”对象传递给函数“std::printf(const char *,...)”作为变量参数。
网上没有任何解释这个警告的含义。
如果文件名为test.txt,您应该如何使printf写出以下内容:
文件名:(将文件名右对齐)test.txt
提前感谢。
解释很简单:只有POD(Plain Old Data结构)可以作为可变参数函数的参数传递(不包括可变参数函数模板,仅限使用省略号的普通可变参数函数)。
std::string
不是POD,但你可以这样做:
printf("%s% 38s\n", "Filename:", filename.c_str());
// ^^^^^^^^
c_str()
成员函数返回一个指向封装的C字符串的const char*
。
printf
在使用 %s
格式说明符时需要一个 char 指针。你可以通过 c_str()
方法从 std::string
获取它:
printf("%s% 38s\n", "Filename:", filename.c_str());
const
引用传递:void displayinfo(const string& filename) { .... }
我真的怀疑网络会保持沉默。也许你看错了地方或使用了错误的关键词。
基本规则很简单,将非POD作为参数传递是未定义行为。除非您的实现定义了某些行为并且与您的任务匹配,否则不要这样做。
特别是对于printf系列,格式字符串需要传递特定类型,即使传递POD也会破坏它。