4

这是如下代码:

  std::stringstream os;

  os << std::hex; // MISRA warning on this line
  os << std::setw(2);
  os << std::setfill('0');

警告:“必需的规则 8-4-4,使用的函数标识符没有 '&' 或带括号的参数列表”

我无法解决这个问题,请提出解决方案。

4

7 回答 7

6

做警告所说的:获取函数的地址:

os << &std::hex;
于 2014-01-30T08:27:25.183 回答
5

只使用&建议的方法怎么样?

#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指向函数的指针

由于对函数的引用具有到函数指针的隐式转换,因此您可以将其中任何一个传递给 anostream并且它将按预期工作。不过,显然 MISRA 要求您明确说明您的意思是我想要该函数还是我想要调用该函数

于 2014-01-30T08:26:48.417 回答
3

你可以做

std::hex(std::cout);

这相当于

std::cout << std::hex;

这将摆脱警告。或者,使用

std::cout << &std::hex;

但这看起来真的很难看,虽然它是正确的。

底线是,MISRA 在这里“错误”/尴尬/出乎意料。std::hex可以像您一样使用,没有任何问题。

于 2014-01-30T08:36:26.817 回答
1

也许这是主题,但请注意一般使用 std::stringstream 和流。它有一个状态,默认情况下它不会抛出。因此,在内存不足的情况下,它只是设置一个“错误”标志而不是抛出 std::bas_alloc,这可能是非常棘手的错误和崩溃的根源。

检查http://www.cplusplus.com/reference/ios/ios/exceptions/

于 2014-01-30T09:51:28.140 回答
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 抱怨将输出流设置为十六进制格式的惯用方式,这太糟糕了。

于 2014-01-30T08:56:12.040 回答
0

首先,您显示的代码对我来说看起来很标准。

我看到了一些可能的解释和相应解决警告的方法:

  1. 流操纵器std::hex的实现符合 MISRA。

    a) 不要使用std::hex.

    b) 修复std::hexstd::hex尝试在您的环境中查找实现。

  2. 包括 std::hex 的代码是一致的,但警告是错误的。

    a) 忽略或抑制警告。

    b) 向您的编译器或代码验证器的供应商提交错误报告。

于 2014-01-30T08:17:57.513 回答
0

你真的有三个选择:

  1. 不使用std::hex
  2. cout<<&std::hex
  3. 提出偏离MISRA 标准的请求

第一个选项可能不实用,第二个很恶心。

幸运的是,MISRA 标准希望这些规则不会被盲目地遵循——来自 MISRA C 标准(这是我唯一可以提交的文本)

严格遵守所有规则是不可能的,在实践中,与个别情况相关的偏差是可以接受的。

这当然并不意味着你可以做你想做的事,相反,标准要求提交偏差请求——如何完成是当地的事情,你的 QMS 应该涵盖它。就您的工具而言,可能有一个选项可以在每次出现的基础上忽略。

于 2014-03-21T13:42:16.670 回答