MISRA C++:2008 Rule 16-2-3

Включайте защиту, буду обеспечен

Описание

Управляйте определением

Включайте защиту, буду обеспечен.

Объяснение

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

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

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

Чтобы избежать нескольких включение того же файла, добавьте, включают защиту в начало заголовочных файлов. Используйте любой из этих форматов:

  • <start-of-file>
    // Comments allowed here
    #if !defined ( identifier )
    #define identifier
    // Contents of file
    #endif
    <end-of-file>
    
  • <start-of-file>
    // Comments allowed here
    #ifndef identifier
    #define identifier
    // Contents of file
    #endif
    <end-of-file>

Реализация Polyspace

Средство проверки повышает нарушение, если заголовочный файл не содержит включать защиту.

Например, этот код использует включать защиту для #define и #include операторы. Этот код не нарушает правило:

// Contents of a header file
#ifndef FILE_H
#define FILE_H
#include "libFile.h"
#endif
Если вы используете, включают защиту, которая не придерживается предложенного формата, Polyspace® отмечает их. Например:

  • Вы можете по ошибке использовать различные идентификаторы в #ifndef и #define операторы:

    #ifndef MACRO
    #define MICRO
    //...
    #endif

  • Вы можете непреднамеренно использовать #ifdef вместо #ifndef или не используйте #define оператор.

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

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

file1.hfile2.hmainfile.cpp
#ifndef MACRO
#define MICRO
//...
#endif
#ifdef DO_INCLUDE
#define DO_INCLUDE
void foo();
#endif
#include"file1.h"
#include"file2.h"
int main(){
	return 0;
}

В этом примере два заголовочных файла включены в файл mainfile.cpp.

  • Включать защита в file1.h запрашивает определение MACRO но условно задает различный идентификатор MICRO, возможно, непреднамеренно. Это включает защиту, неправильно отформатирован. Polyspace отмечает файл.

  • Включать защита в file2.h использование #ifdef вместо #ifndef. Это включает защиту, является неправильным, и Polyspace отмечает файл.

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

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