﻿# V1049\. The 'foo' include guard is already defined in the 'bar1\.h' header\. The 'bar2\.h' header will be excluded from compilation\.

Анализатор обнаружил объявление одного и того же include guard в разных заголовочных файлах, включенных в одну единицу трансляции\. Это приводит к тому, что произойдёт "вставка" тела только одного файла, включенного первым\.

Это диагностическое правило применяется к проектам на языке C\.

Рассмотрим пример заголовочного файла header1\.h:

```cpp
// header1.h
#ifndef _HEADER_H_
#define _HEADER_H_
....
#endif
```

и header2\.h:

```cpp
// header2.h
#ifndef _HEADER_H_ 
#define _HEADER_H_ // <=
....
#endif
```

При создании второго заголовочного файла, программист скопировал код из первого файла и забыл переименовать макрос '\_HEADER\_H\_'\.

Таким образом, при компиляции следующего фрагмента, код из header2\.h не будет включён в итоговый файл:

```cpp
....
#include "header1.h"
#include "header2.h"
...
```

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

Язык C позволяет вызывать необъявленные функции\. В таких случаях предполагается, что функция возвращает значение типа 'int', и аргументы тоже имеют тип 'int'\. Если заголовочный файл с объявлениями функций был исключен из компиляции, сборка проекта может пройти успешно, но во время выполнения программа будет работать некорректно\. Подобная ситуация, например, описана в статье "[Красивая 64\-битная ошибка на языке Си](https://pvs-studio.ru/ru/blog/posts/cpp/0033/)"\.

Чтобы исправить ошибку, необходимо использовать уникальные имена include guard в заголовочных файлах\.

См\. также родственную диагностику: [V1031\. Function is not declared\. The passing of data to or from this function may be affected](https://pvs-studio.ru/ru/docs/warnings/v1031/)\.