Включение заголовка в несколько заголовков в моем коде на 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){ //... }