以下代码如下:
std::stringstream os;
os << std::hex; // MISRA warning on this line
os << std::setw(2);
os << std::setfill('0');
警告:“必需规则8-4-4,功能标识符不使用'&amp;'或括号参数列表“
我无法解决此问题,请提出解决方案。
答案 0 :(得分:5)
执行警告所说的内容:获取函数的地址:
os << &std::hex;
答案 1 :(得分:4)
如何使用&
之类的建议?
#include <iomanip>
#include <iostream>
#include <sstream>
int main() {
std::stringstream os;
os << &std::hex; // Works with &
os << std::setw(2);
os << std::setfill('0');
os << 13;
std::cout << os.str() << "\n";
return 0;
}
是的,it works too。
有什么区别?
std::hex
是参考以实现&std::hex
是指针的功能由于对函数的引用具有到函数指针的隐式转换,因此您可以将其传递给ostream
,它将按预期工作。但显然,MISRA要求你明确表示你是否想要我想要函数或我想要调用函数。
答案 2 :(得分:2)
你可以做到
std::hex(std::cout);
相当于
std::cout << std::hex;
哪个会摆脱警告。或者,使用
std::cout << &std::hex;
但这看起来很难看,虽然这是正确的。
底线是,MISRA在这里是错误的&#34; /尴尬/意外。 std::hex
可以像你一样使用,没有任何问题。
答案 3 :(得分:1)
该行
os << std::hex;
最终调用重载
basic_ostream<charT,traits>& basic_ostream::operator<<(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&))
这是一个operator<<()
重载,它接受一个带有basic_ostream<>
参数的函数的指针。 std::hex
就在这里。
operator<<()
重载只是通过指针调用函数。因此,您可以执行以下任何等效的操作:
os << &std::hex; // makes the function pointer explicit using the & operator
std::hex(os); // call the `std::hex` function using a normal function call syntax
// or directly call the function that `std::hex(os)` is specified to do:
os.setf(std::ios_base::hex, std::ios_base::basefield);
MISRA抱怨将输出流设置为十六进制格式的惯用方法太糟糕了。
答案 4 :(得分:1)
也许这是主题,但通常使用std :: stringstream和stream。它有一个状态,默认情况下它不会抛出。因此,在内存不足的情况下,它只是设置一个“错误”标志,而不是抛出std :: bas_alloc,这可能是非常棘手的错误和崩溃的来源。
答案 5 :(得分:0)
首先,您展示的代码对我来说非常标准。
我看到了一些可能的解释和方法来相应地解决警告:
流操作符std::hex
是符合MISRA标准的。
a)不要使用std::hex
。
b)修复std::hex
。尝试在您的环境中查找std::hex
的实施。
包含std :: hex的代码符合,但警告是错误的。
a)忽略或取消警告。
b)向编译器或代码验证器的供应商提交错误报告。
答案 6 :(得分:0)
你真的有三个选择:
std::hex
cout<<&std::hex
第一个选项可能不实用,第二个选项是icky。
幸运的是,MISRA标准期望不会盲目遵循规则 - 从MISRA C标准(这是我唯一可以提供的文本)
严格遵守所有规则是不可能的,并且在实践中,可以接受与个别情况相关的偏差。
这并不意味着你可以做你想做的事情,相反,标准期望提交偏差请求 - 如何做到这一点是本地问题,以及你的质量管理体系应该覆盖它。就您的工具而言,可能存在基于每次出现而忽略的选项。