Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Директивы условной компиляции '#else', '#elif' и '#endif' должны находиться в том же файле, что и '#if', '#ifdef' или '#ifndef', к которым они относятся. Несоответствие этому правилу приводит к визуальному усложнению кода и увеличивает вероятность совершить ошибку при редактировании и обслуживании кода.
Замечание: при использовании современных компиляторов допустить данную ошибку невозможно. Неправильное использование директив условной компиляции в них приводит к ошибкам сборки программы.
Рассмотрим примеры:
#define Check_A 10 #ifdef Check_A // <= #if Check_A > 5 static int a = 5; #elif Check_A > 2 static int a = 2; #else static int a = 0; #endif // <= int main(void) { return a; }
В первом примере используется вложенное условие, состоящее из '#ifdef' и '#if', но в конце, закрывается только вторая директива условной компиляции ('#if'), а первая ('#ifdef') остаётся открытой, что может привести к созданию некорректного кода.
Рассмотрим другой пример:
/* File.h */ #ifdef Check_B #include "SomeOtherFile.h" // <= /* End of File.h */
В данном примере не закрывается директива условной компиляции. Включение данного файла в другие с помощью директивы препроцессора '#include' может привести к трудноуловимым ошибкам.
Данная диагностика классифицируется как:
|