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