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: необходимый
Язык: C90, C99

Введенный в R2014b