Misra C 2008奇怪的警告
MISRA C++ 2008 strange warning
这是下面的代码,
std::stringstream os;
for (size_t i = 0U; i < len; i++) {
os << static_cast<uint32_t>(src[i]);
}
警告是:"咨询规则14-8-2,可行集合都包含两个功能 和模板:STD :: BASIC_OSTREAM ::操作员&lt;&lt;"
对于以下代码
的行os << static_cast<uint32_t>(src[i]);
请建议如何解决这个问题,我是C 的新手,并且确定相同。
正在触发MISRA警告,因为basic_ostream
定义了一个成员operator<<
,该成员是一组非template Overloads,也是一组免费的功能模板版本。正如警告所述,超载分辨率的候选人设置包括这两个 - 功能模板和非templates。
您的选项是抑制此行的警告,或者找出一种不使用operator<<
执行格式化输出的方法。可以通过创建数字的中间字符串表示,然后使用basic_ostream::write
来输出字符来完成。如果您有C 11编译器,则可以使用std::to_string
来执行此操作。
auto s = std::to_string(42U);
std::stringstream ss;
ss.write(s.c_str(), s.size());
如果您不能使用to_string
或需要其他格式,则总有s(n)printf
用于创建字符串表示。
我个人的看法是抑制该警告,理由是您使用了标准库中定义良好且众所周知的类型。
您使用的是非常通用的类型:std :: stringstream。可能是
template<class charT, class traits, class T>
basic_ostream<charT,traits>& operator<< (basic_ostream<charT,traits>&& os, const T& val);
以及
ostream& operator<< (ostream& os, ...);
Herb Sutter有一篇很棒的文章,说明了为什么这一规则有意义。它与C 标准处理模板和非模板功能之间的过载分辨率的特定顺序有关。选择的实际功能可能并不总是遵循程序员的期望。链接在这里:http://www.gotw.ca/publications/mill17.htm
似乎在那里有一些轻度危险的代码。
相关文章:
- 警告处理为错误这里有什么问题
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- cppcheck在const std::string[]上引发警告
- GCC对可能有效的代码抛出init list生存期警告
- 如何在BST的这个简单递归实现中消除警告
- 关于std::move的使用,是否有编译警告
- g++ 在某个类成员未初始化时不发出警告
- 如何处理来自核心指南检查器的关于gsl::at的静态分析警告
- 使用typeid警告未使用的变量
- 示例C++项目编译中的警告
- 警告:在函数返回类型 [-Wignore 限定符] 时忽略类型限定符
- 如何修复编译器警告 C6386 和 C6385?
- 返回语句后的代码,没有警告
- Misra C 2008奇怪的警告
- Visual Studio 2008 运行时堆栈溢出警告,当运算符在所有路径上<递归时警告
- 在Visual Studio 2008中设置编译时警告,类似"static_if"?
- 在 Visual Studio 2008 中禁用 Qt 警告
- LNK4099链接器警告与干净安装Qt SDK和Visual c++ 2008
- 如何在MS Visual Studio C++2008中将所选警告视为错误
- 为什么在Visual c++ 2008中构建结构时得到这些警告?