c++传递字符串时的非pod警告

c++ non-POD warning for passing a string?

本文关键字:pod 警告 字符串 c++      更新时间:2023-10-16
void displayinfo(string &filename)
{
printf("%s% 38sn", "Filename:", filename);
...

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

网上没有解释这个警告是什么意思。

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

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

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

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

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

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

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

printf("%s% 38sn", "Filename:", filename.c_str());
作为题外话,请注意,如果您不打算修改或复制输入字符串,您应该传递const引用:
void displayinfo(const string& filename) { .... }

我非常怀疑网络是否会沉默。也许你看错了地方或者用错了关键字。

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

特别是对于printf族,格式字符串需要传递特定的类型,即使传递POD有效,也会破坏它