MISRA C:2012 Rule 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.

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

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