# 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:

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

и header2.h:

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

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

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

    ....
    #include "header1.h"
    #include "header2.h"
    ...

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

Язык C позволяет вызывать необъявленные функции. В таких случаях предполагается, что функция возвращает значение типа 'int', и аргументы тоже имеют тип 'int'. Если заголовочный файл с объявлениями функций был исключен из компиляции, сборка проекта может пройти успешно, но во время выполнения программа будет работать некорректно. Подобная ситуация, например, описана в статье "Красивая 64-битная ошибка на языке Си".

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

См. также родственную диагностику: V1031. Function is not declared. The passing of data to or from this function may be affected.