15

我在头文件中有以下函数声明:

extern void flash(const char *message, const enum msg_type type);

基本上,它需要两个参数并将相应的消息推送到全局消息队列中。因为它不需要修改参数,所以我对它们进行了 const 限定。但是,CLion 的静态代码分析器发出了警告:

Clang-Tidy:参数 'type' 在函数声明中是 const 限定的;参数的 const 限定仅对函数定义有影响

在此处输入图像描述

这是我的问题:

  1. 我对两个参数都进行了 const 限定,为什么只有后者触发警告?
  2. 真的很糟糕吗?我知道它没有效果,但从技术上讲,const限定符也没有效果。
  3. 我可以摆脱这个警告吗?
4

2 回答 2

12

第一个参数是类型const char *,或指向常量字符的指针。这意味着您可以向函数传递一个指向您无法修改的字符串的指针,例如:

const char* msg = "Hello, world!";
flash(msg, SOME_MESSAGE_TYPE);

您不能更改msg;中的字符 它是一个指向const char. 将其传递给具有参数类型char*的函数将表明该函数可能会更改它们,这是非法的。参数类型中的thisconst与调用者相关,因此保留。

另一方面,enum msg_type只是一个enum, 并将被复制到函数中。调用函数时,我不在乎函数体中发生了什么type;它不会影响函数之外的任何内容。说没有const什么区别,因此发出警告。

如果您将第一个参数更改为const char *const message,那么它也会发出警告。这表明您无法更改指针message指向的内容,而调用者也不关心它,因为它传入的任何指针都不会改变。


这还不错。它告诉你你可能会感到困惑,但在这种情况下它不会伤害任何东西。但是,您仍然应该摆脱警告,因为警告表明潜在的问题,并且用非问题噪音堵塞它们只会降低您阅读重要警告的可能性。


将头文件更改为没有第二个参数,但不是在任何地方flash实现。const在实现它的地方,保留它,const这样你就不会type在函数体内进行实际更改,但在声明中不需要它。

于 2018-07-16T02:22:04.080 回答
3

我对这两个参数都进行了 const 限定,为什么只有后者触发警告?

正如您的警告所说,它不会影响原型。它只影响执行。

真的很糟糕吗?

它是噪音,意思是它不会影响任何东西,但除此之外,没有。

我可以摆脱这个警告吗?

您可以安全地删除const限定符,因为它不是必需的。

但是,使用clang-tidy. 此链接可能会有所帮助:

clang-tidy:如何抑制警告?

但这些警告实际上可能是一种祝福。不小心写int foo(const char *)而不是int foo(char * const). 后者不会触发此警告,因此如果您收到此警告,则表明您混淆了某些内容。

于 2018-07-16T02:23:06.330 回答