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: Требуется