exponenta event banner

MISRA C:2012 Правило 20.4

Макрос не должен быть определен с тем же именем, что и ключевое слово

Описание

Определение правила

Макрос не должен быть определен с тем же именем, что и ключевое слово.

Объяснение

Использование макросов для изменения значения ключевых слов может привести к путанице. Поведение не определено, если включен стандартный заголовок, в то время как макрос определен с тем же именем, что и ключевое слово.

Дополнительное сообщение в отчете

  • Макрос macro_name не должны быть переопределены.

  • Макрос macro_name не должно быть неопределенным.

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

развернуть все

#include <stdlib.h>
#define int some_other_type /* Non-compliant - int keyword behavior altered */
           
//...

В этом примере #define нарушает правило 20.4, поскольку изменяет поведение int ключевое слово. Включение стандартного заголовка приводит к неопределенному поведению.

Исправление - переименовать ключевое слово

Одной из возможных корректировок является использование другого ключевого слова:

#include <stdlib.h>
#define int_mine some_other_type

//...
#define while(E) for ( ; (E) ; )  /* Non-compliant - while redefined*/
#define unless(E) if ( !(E) )     /* Compliant*/

#define seq(S1, S2) do{ S1; S2;} while(false)  /* Compliant*/
#define compound(S) {S;}                       /* Compliant*/
//...

В этом примере переопределение ключевого слова несовместимо while, но это соответствует определению макроса, который расширяется до операторов.

#define inline // Non-compliant 

В этом примере переопределение inline соответствует C90, но не C99, потому что inline не является ключевым словом в C90.

Проверить информацию

Группа: Директивы предварительной обработки
Категория: Обязательно
Категория СМЖЛ: требуется