代码如下:
std::stringstream os;
os << std::hex; // MISRA warning on this line
os << std::setw(2);
os << std::setfill('0');
警告:“必需的规则 8-4-4,使用不带 '&' 或带括号的参数列表的函数标识符”
我无法解决这个问题,请提出解决方案。
按照警告执行操作:获取函数的地址:
os << &std::hex;
像建议的那样使用
&
怎么样?
#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;
}
是的,它也有效。
有什么区别?
std::hex
是功能的参考&std::hex
是函数的指针由于对函数的引用具有到函数指针的隐式转换,因此您可以将其中任何一个传递给
ostream
,它将按预期工作。但显然,MISRA 要求您明确表示您的意思是“我想要该函数”还是“我想要调用该函数”。
你可以做
相当于
std::cout << std::hex;
这将消除警告。或者,使用
std::cout << &std::hex;
但这看起来真的很难看,尽管它是正确的。
底线是,MISRA 在这里是“错误的”/尴尬的/出乎意料的。
std::hex
可以像您一样使用,没有任何问题。
也许这是题外话,但一般要注意使用 std::stringstream 和流。它有一个状态,默认情况下它不会抛出异常。因此,如果内存不足,它只是设置一个“错误”标志,而不是抛出 std::bas_alloc,这可能是非常棘手的错误和崩溃的根源。
最终调用了重载
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 抱怨将输出流设置为十六进制格式的惯用方法,这太糟糕了。
您确实有三个选择:
std::hex
cout<<&std::hex
偏离 MISRA 标准的请求
严格遵守所有规则是不可能的,但在实践中,与个人情况相关的偏差是可以接受的。
这当然并不意味着您可以做您想做的事,相反,标准期望提交偏差请求
- 如何完成此操作是当地的问题,以及您的质量管理体系(QMS)或您当地的流程手册的名称,应该覆盖它。就您的工具而言,可能有一个选项可以在每次出现时忽略。
首先,您显示的代码对我来说看起来非常标准。
流操纵器
std::hex
a) 不要使用
std::hex
。
b) 修复
std::hex
。尝试在您的环境中查找 std::hex
的实现。
包含 std::hex 的代码是一致的,但警告是错误的。b) 向编译器或代码验证器的供应商提交错误报告。