﻿# V2616\. MISRA\. All conditional inclusion preprocessor directives should reside in the same file as the conditional inclusion directive to which they are related\.

Диагностическое правило основано на руководстве [MISRA](https://www.misra.org.uk/) \(Motor Industry Software Reliability Association\) по разработке программного обеспечения\.

Директивы условной компиляции '\#else', '\#elif' и '\#endif' должны находиться в том же файле, что и '\#if', '\#ifdef' или '\#ifndef', к которым они относятся\. Несоответствие этому правилу приводит к визуальному усложнению кода и увеличивает вероятность совершить ошибку при редактировании и обслуживании кода\.

Замечание: при использовании современных компиляторов допустить данную ошибку невозможно\. Неправильное использование директив условной компиляции в них приводит к ошибкам сборки программы\.

Рассмотрим примеры:

```cpp
#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'\) остаётся открытой, что может привести к созданию некорректного кода\.

Рассмотрим другой пример:

```cpp
/* File.h */
#ifdef Check_B
#include "SomeOtherFile.h"    // <=
/* End of File.h */
```

В данном примере не закрывается директива условной компиляции\. Включение данного файла в другие с помощью директивы препроцессора '\#include' может привести к трудноуловимым ошибкам\.