GCC C предупреждение "дубликат" const "декларации" - PullRequest
1 голос
/ 21 мая 2019

Почему я получаю

дубликат спецификатора объявления "const" [-Wduplicate-decl-спецификатор]

для этого объявления?

extern uint8_t CalculateChecksum(const communicationBlock_t const *messageBlock);

Где communicationBlock_t - это структура.

Я не могу изменить функцию, на которую указывает параметр, и не хочу, чтобы она была в состояниичтобы указать этот параметр в другом месте.

Что я делаю неправильно?

Ответы [ 2 ]

5 голосов
/ 21 мая 2019

Оба ключевых слова const, которые вы написали, относятся к communicationBlock_t. Вы, вероятно, хотели это:

extern uint8_t CalculateChecksum(const communicationBlock_t * const messageBlock);

Правило таково: const применяется слева, если это не крайний левый спецификатор, тогда оно применяется справа.

2 голосов
/ 21 мая 2019

Достаточно написать

uint8_t CalculateChecksum(const communicationBlock_t* messageBlock);

Это означает, что вы не можете изменить указанное содержимое.Если вы хотите заблокировать получение указателя на другой адрес, вы должны написать * const.

Но в этом нет необходимости, messageBlock является локальной копией исходного указателя, и вызывающей стороне не нужно заботиться о том, что эта функция делает с ним внутри.

Это вопрос стиля:

Некоторые считают, что каким-то образом это добавляет дополнительную безопасность, сохраняя внутреннюю часть функции постоянной.Они также считают, что имеет смысл писать такие вещи, как void func (const int n).Многие, кто проповедует этот стиль, являются программистами на C ++, которые const квалифицируют функции-члены, что является совершенно другим делом и в любом случае не может быть выполнено в C.

Другие (как я) считают, что const-квалифицирующие параметры с * const считается ненужным беспорядком, который сбивает с толку читателя, поскольку объявление функции следует рассматривать как документацию для вызывающей функции, а не для реализации определения функции.

...