在 C++ 中取消引用 nullptr 警告

Derefencing nullptr warning in c++

if (nullptr!=timing_info)
{
   timing_info->h = start_time;
}

我收到以下警告

autosar_cpp14 a5-1-1 violation
Using literal "NULL" other than type initialization, where symbolic names shall be used instead.

autosar 规则 a5-1-1 读取

Rule A5-1-1 (required, implementation, partially automated) Literal values shall not be used apart from type initialization, otherwise symbolic names shall be used instead.

我从没想过 "nullptr" 是字面值。如果它是文字值,那么处理此警告的最佳方法是什么。

正如你已经引用的那样,Rule A5-1-1

Rule A5-1-1 (required, implementation, partially automated)Literal values shall not be used apart from type initialization, otherwise symbolic names shall be used instead.

(source)

这条规则背后的想法是你不应该使用 magic constants,即不要写类似

的东西
// 100 is a magic constant. It's not clear what the next line means without comments.
if (list.size() > 100) {
  std::cout << "error!";
} else {
  std::cout << "everything ok!";
}

而是写

static constexpr auto maximum_allowed_size = 100;
// The next line speaks for itself: "if list is bigger than allowed ..."
if (list.size() > maximum_allowed_size) {
  std::cout << "error!";
} else {
  std::cout << "everything ok!";
}

这个额外的常量在大多数情况下提高了可读性。 Since nullptr is a literal 并且您将文字 nullptr 用于 "type initialization" 以外的其他内容,您的代码违反了规则 A5-1-1。

我不知道 autosar 是否有意不鼓励使用文字 nullptr,我个人认为没有理由这样做。也许它已经被监督了(应该是一个例外)。

您可以改写代码以使检查器静音:

if (timing_info)  // implicitly convert pointer to bool

由于该变体显然也让检查员不高兴,这里是另一个变体:

if (!!timing_info)  // convert pointer to bool using double negation

您也可以使用强制转换,但我不会那样做。说实话,我最喜欢原版(if (nullptr != timing_info))