函数声明中参数的 Const 限定

Const-qualification of parameters in function declaration

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

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

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

Clang-Tidy: Parameter 'type' is const-qualified in the function declaration; const-qualification of parameters only has an effect on function definitions

这是我的问题:

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

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

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

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

另一方面,enum msg_type 只是一个 enum,将被复制到函数中。调用函数时,我不关心带有 type 的函数体中发生了什么;它不会影响函数之外的任何东西。说 thisconst 没有区别,因此警告。

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


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


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

I const-qualified both parameter, why does only the latter trigger a warning?

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

Is it really bad?

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

Can I get rid of this warning?

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

然而,用clang-tidy来抑制一般的警告似乎有点乱。这 link 可能会有所帮助:

但这些警告实际上是一种祝福。不小心写成 int foo(const char *) 而不是 int foo(char * const) 的情况并不少见。后者不会触发此警告,因此如果您收到此警告,则表示您混淆了某些内容。