我在头文件中有以下函数声明:
extern void flash(const char *message, const enum msg_type type);
基本上,它采用两个参数并将对应的消息推送到全局消息队列中。由于不需要修改参数,因此我对它们进行了const限定。但是,CLion的静态代码分析器忽略了警告:
Clang-Tidy:参数'type'在函数声明中是const限定的;参数的const限定只会影响函数定义
这是我的问题:
const
限定词也没有作用。答案 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
来抑制警告似乎有些混乱。该链接可能会有所帮助: