Включение заголовка в несколько заголовков в моем коде на C++

Я пытаюсь включить в свой код файл заголовка из книги Численные рецепты (https:://github.com/blackstonep/Numerical-Recipes). Файлы заголовков, которые я должен включить, - это nr3.hpp и interp_1d.hpp. Для работы interp_1d необходимы определения nr3.

Я напишу часть кода, который появляется на interp_1d.hpp, чтобы вы поняли, с чем я имею дело с кодом interp_1d:

      struct Base_interp{
...
};
Int Base_interp::locate(const Doub x){
...
}
...
Doub BaryRat_interp::interp(Doub x){
...
}

В этом файле заголовка нет защиты заголовка. В результате, когда я пытаюсь ввести его в несколько других файлов заголовков, я получаю сообщение об ошибке «66 повторяющихся символов для архитектуры x86_64».

Структура моего кода следующая:

      myPulse.hpp:
#include "nr3.hpp"
#include "interp_1d.hpp"

calc1.hpp:
#include "myPulse.hpp"

calc2.hpp:
#include "myPulse.hpp"

main.cpp:
#include "myPulse.hpp"
#include "calc1.hpp"
#include "calc2.hpp"
#include "nr3.hpp"
#include "interp_1d.hpp"

Я не знаю, как решить эту проблему. Я хочу иметь возможность использовать функции interp_1d.hpp более чем в одной части кода. Я попытался включить защиту заголовка, но это не сработало:

      #ifndef Interp_1d
#define Interp_1d

#endif

Кто-нибудь знает, как я использую заголовок interp_1d в нескольких других заголовках без возникновения этой ошибки?

заранее спасибо

1 ответ

Решение

При работе с одним файлом (или для краткости с книгами) некоторый код можно упростить, но сделать регистр нескольких файлов неверно.

В вашем случае защита заголовков отсутствует и отсутствует (или файл cpp для определения).

Поэтому вы не можете использовать их как есть.

У вас есть либо:

  • код разделения для файла заголовка / cpp:

            // interp_1d.hpp
    #pragma once // or include guards
    struct Base_interp{
    //...
    };
    
            //interp_1d.cpp
    #include "interp_1d.hpp"
    Int Base_interp::locate(const Doub x){
    //...
    }
    
    Doub BaryRat_interp::interp(Doub x){
    //...
    }
    
  • или поставить дополнительно inline/ static (не всегда достаточно / возможно (например, глобальные)) и защита заголовка.

            // interp_1d.hpp
    #pragma once // or include guards
    struct Base_interp{
    //...
    };
    
    inline Int Base_interp::locate(const Doub x){
    //...
    }
    
    inline Doub BaryRat_interp::interp(Doub x){
    //...
    }
    
Другие вопросы по тегам