函数声明中参数的常量限定

nal*_*zok 7 c const declaration clion clang-tidy

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

extern void flash(const char *message, const enum msg_type type);
Run Code Online (Sandbox Code Playgroud)

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

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

在此处输入图片说明

这是我的问题:

  1. 我用const限定了这两个参数,为什么只有后者会触发警告?
  2. 真的不好吗?我知道这没有效果,但是从技术上讲,const限定词也没有效果。
  3. 我可以摆脱这个警告吗?

Dan*_*l H 5

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

const char* msg = "Hello, world!";
flash(msg, SOME_MESSAGE_TYPE);
Run Code Online (Sandbox Code Playgroud)

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

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

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


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


将头文件(但无论在何处flash实现)都更改为不包含const第二个参数。在实现的地方,保留,const以便您实际上不在type函数体内进行更改,但是在声明中不需要。