函数声明中的参数常量

时间:2018-07-16 01:54:18

标签: c const declaration clion clang-tidy

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

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

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

  

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

enter image description here

这是我的问题:

  1. 我用const修饰了两个参数,为什么只有后者会发出警告?
  2. 真的很糟吗?我知道它没有任何作用,但是从技术上讲const限定词也没有作用。
  3. 我可以摆脱这个警告吗?

2 个答案:

答案 0 :(得分:4)

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

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

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

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

如果将第一个参数更改为const char *const message,它也会发出警告。这表明您无法更改指针message指向的内容,调用者也不在乎,因为它传递的指针不会改变。


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


更改头文件,但不要在实现flash的任何地方进行更改,以使第二个参数上没有const。在实现的地方,请保留const,以便您实际上不必在函数体内更改type,但在声明中不需要。

答案 1 :(得分:2)

  

我用const修饰了两个参数,为什么只有后者会触发警告?

正如您的警告所述,它不会影响原型。它只会影响实施。

  

真的很糟糕吗?

这是噪音,它不会影响任何东西,但除此之外,不会。

  

我可以摆脱这个警告吗?

由于不需要const限定词,因此可以放心地删除它。

但是,通常使用clang-tidy来抑制警告似乎有些混乱。该链接可能会有所帮助:

clang-tidy: How to suppress warnings?