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

Весь #else, #elif и #endif директивы препроцессору должен находиться в том же файле как #if или #ifdef директива, с которой они связаны

Описание

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

Весь #else, #elif и #endif директивы препроцессору должен находиться в том же файле как #if или #ifdef директива, с которой они связаны.

Объяснение

Вы используете директивы препроцессору, такие как #if...#elif...#else...#endif, условно включать или исключить блоки кода. Если различные ветви такой директивы находятся в файлах другого источника, код может сбить с толку. Если все ветви не включены в проект, код может вести себя неожиданными способами. Чтобы избежать беспорядка и неожиданного поведения, сохраните ветви условной директивы препроцессору в том же исходном файле.

Реализация Polyspace

Polyspace® повышает нарушение этого правила, если любое из этих условий верно:

  • Соответствующий #if директива не может быть найдена в исходном файле для каждого #else, #elif, или #endif директива.

  • Соответствующий #endif директива не может быть найдена в исходном файле для каждого #if директива.

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

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

Примеры

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

//file1.h
#if !defined (FILE)
//.....
#elif //Noncompliant
//...///
//file2.h
#else //Noncompliant
//...
#endif //Noncompliant
///

В этом примере условная директива разделена через два исходных файла.

  • В file1.h, #if директива не имеет никакого соответствующего #endif директива. Polyspace отмечает блок.

  • В file2.h, #else и #endif директивы не имеют никакого соответствующего #if директива. Polyspace отмечает обе директивы.

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

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