GCC C 警告 "duplicate ‘const’ declaration "
GCC C warning "duplicate ‘const’ declaration "
为什么我得到
duplicate ‘const’ declaration specifier [-Wduplicate-decl-specifier]
这个声明?
extern uint8_t CalculateChecksum(const communicationBlock_t const *messageBlock);
其中 communicationBlock_t
是一个结构。
我不希望该函数能够更改参数指向的结构,也不希望它能够将该参数指向其他地方。
我做错了什么?
您写的两个 const
关键字都适用于 communicationBlock_t
。你可能想要这个:
extern uint8_t CalculateChecksum(const communicationBlock_t * const messageBlock);
规则是:const
适用于左边,除非它是最左边的说明符,否则它适用于右边。
写就够了
uint8_t CalculateChecksum(const communicationBlock_t* messageBlock);
这意味着您无法更改 pointed-at 内容。如果你想阻止一个指针被分配到一个不同的地址,你可以写 * const
。
但这里没有必要,messageBlock
是原始指针的本地副本,调用者不应该关心该函数在内部对它做了什么。
这是风格问题:
一些人认为,通过保留函数的内部结构,以某种方式增加了额外的安全性 const-qualified。他们还认为写 void func (const int n)
这样的东西在某种程度上是有意义的。许多宣扬这种风格的 C++ 程序员习惯于 const
限定成员函数——这完全是另外一回事,无论如何都不能在 C 中完成。
其他人(比如我)认为带有 * const
的 const 限定参数被认为是混淆 reader 的不必要的混乱,因为函数声明将被视为调用者的文档函数,不适用于函数定义的实现者。
为什么我得到
duplicate ‘const’ declaration specifier [-Wduplicate-decl-specifier]
这个声明?
extern uint8_t CalculateChecksum(const communicationBlock_t const *messageBlock);
其中 communicationBlock_t
是一个结构。
我不希望该函数能够更改参数指向的结构,也不希望它能够将该参数指向其他地方。
我做错了什么?
您写的两个 const
关键字都适用于 communicationBlock_t
。你可能想要这个:
extern uint8_t CalculateChecksum(const communicationBlock_t * const messageBlock);
规则是:const
适用于左边,除非它是最左边的说明符,否则它适用于右边。
写就够了
uint8_t CalculateChecksum(const communicationBlock_t* messageBlock);
这意味着您无法更改 pointed-at 内容。如果你想阻止一个指针被分配到一个不同的地址,你可以写 * const
。
但这里没有必要,messageBlock
是原始指针的本地副本,调用者不应该关心该函数在内部对它做了什么。
这是风格问题:
一些人认为,通过保留函数的内部结构,以某种方式增加了额外的安全性 const-qualified。他们还认为写 void func (const int n)
这样的东西在某种程度上是有意义的。许多宣扬这种风格的 C++ 程序员习惯于 const
限定成员函数——这完全是另外一回事,无论如何都不能在 C 中完成。
其他人(比如我)认为带有 * const
的 const 限定参数被认为是混淆 reader 的不必要的混乱,因为函数声明将被视为调用者的文档函数,不适用于函数定义的实现者。