Misra C 2008奇怪的警告

MISRA C++ 2008 strange warning

本文关键字:警告 2008 Misra      更新时间:2023-10-16

这是下面的代码,

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

似乎在那里有一些轻度危险的代码。