c++传递字符串时的非pod警告
c++ non-POD warning for passing a string?
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有效,也会破坏它
相关文章:
- 警告处理为错误这里有什么问题
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- 获取隐式转换溢出从无符号到已签名的警告
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 包装非POD类型:无警告,尺寸意外
- c++传递字符串时的非pod警告
- 使c++对未初始化的POD成员变量发出警告
- 如何在MSVC中为传递给变分函数的非POD参数启用警告/错误