gpt4 book ai didi

函数声明中参数的 Const 限定

转载 作者:太空狗 更新时间:2023-10-29 17:09:47 27 4
gpt4 key购买 nike

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

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

enter image description here

这是我的问题:

  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,但在声明中不需要它。

关于函数声明中参数的 Const 限定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51353648/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com