函数声明中参数的 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
这是我的问题:
- 我对两个参数都进行了 const 限定,为什么只有后者触发警告?
- 真的很糟糕吗?我知道它没有效果,但技术上指定
const
限定符也没有效果。
- 我可以去掉这个警告吗?
第一个参数的类型为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
,但在声明中不需要它。
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)
的情况并不少见。后者不会触发此警告,因此如果您收到此警告,则表示您混淆了某些内容。
我在头文件中有以下函数声明:
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
这是我的问题:
- 我对两个参数都进行了 const 限定,为什么只有后者触发警告?
- 真的很糟糕吗?我知道它没有效果,但技术上指定
const
限定符也没有效果。 - 我可以去掉这个警告吗?
第一个参数的类型为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
,但在声明中不需要它。
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)
的情况并不少见。后者不会触发此警告,因此如果您收到此警告,则表示您混淆了某些内容。