MISRA C:2012 Dir 4.10

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

Описание

Направляющее определение

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

Объяснение

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

Например, предположите, что заголовочный файл содержит:

#ifdef _WIN64
   int env_var;
#elseif  
   long int env_var;
#endif
Если заголовочный файл содержится в двух путях к включению, тот, который задает макро-_WIN64 и другой, который не задает его, у вас могут быть конфликтные определения env_var.

Реализация Polyspace

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

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

<start-of-file>
#ifndef <control macro>
#define <control macro>
    /* Contents of file */
#endif
<end-of-file>
или
<start-of-file>
#ifdef <control macro> 
#error ...
#else
#define <control macro>
    /* Contents of file */
#endif
<end-of-file>
Если вы не используете один из этих методов, Polyspace® отмечает включение заголовочного файла как несовместимое.

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

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

Примеры

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

#ifndef  __MY_MACRO__ 
#define __MY_MACRO__
    void func(void);
#endif
void func2(void);

Если заголовочный файл содержит этот код, это несовместимо, потому что макро-защита не покрывает целое содержимое заголовочного файла. Линия void func2(void) находится вне защиты.

Примечание

У вас могут быть комментарии вне макро-защиты.

void func(void);
#ifndef  __MY_MACRO__ 
#define __MY_MACRO__
    void func2(void);
#endif

Если заголовочный файл содержит этот код, это несовместимо, потому что макро-защита не покрывает целое содержимое заголовочного файла. Линия void func(void) находится вне защиты.

Примечание

У вас могут быть комментарии вне макро-защиты.

#ifndef  __MY_MACRO__ 
#define __MY_MARCO__
    void func(void);
    void func2(void);
#endif

Если заголовочный файл содержит этот код, это несовместимо потому что макро-имя в #ifndef оператор отличается от имени в следующем #define оператор.

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

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