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

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

Описание

Управляйте определением

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

Объяснение

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

Обменивайтесь сообщениями в отчете

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

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

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

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

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

Исправление — Переименовывает ключевое слово

Одно возможное исправление должно использовать различное ключевое слово:

#define int_mine some_other_type
#include <stdlib.h>
...
#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

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

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

Группа: предварительная обработка директив
Категория: необходимый
Категория AGC: необходимый
Языки: C90, C99