Почему в заголовочных файлах Numeric Recipes нет элементов защиты?
Начинающий программист C++ здесь.
Я использую исходный код Numeric Recipes (V3) как часть более крупного модулированного проекта C++.
Хотя я постараюсь не вдаваться в подробности моей проблемы, мне любопытно, почему эти файлы заголовков NR не содержат никаких средств защиты заголовков? Я знаю, что этот вопрос очень специфичен для тех, кто использовал этот код в прошлом, но, глядя на форумы NR, они кажутся довольно неактивными...
Ошибки, которые я нахожу с моим кодом, который вызвал этот вопрос:
ошибка LNK2005: "void __cdecl gaussj(класс NRmatrix &)" (?gaussj@@YAXAAV?$NRmatrix@N@@@Z) уже определено в Schmidt_V2_(Zeta).obj
ошибка LNK2005: "void __cdecl gaussj(класс NRmatrix &, класс NRmatrix &)" (?gaussj@@YAXAAV?$NRmatrix@N@@0@Z) уже определен в Schmidt_V2_(Zeta).obj
1 ответ
AFAIK нет веской причины. Есть несколько ситуаций, в которых вы могли бы по праву хотеть не использовать встроенную защиту (см. Этот вопрос), но это не одна из них.
Если вам нужно включить эти заголовки из нескольких мест в ваш проект, вы должны ввести своих собственных охранников, например так:
#include <a_normal_thing>
#include <another_normal_thing>
#ifndef SPECIAL_NONESENSE_H
#define SPECIAL_NONESENSE_H
#include <special_nonsense>
#endif
// More normal includes...
Это многословно и раздражает, но это сработает.
РЕДАКТИРОВАТЬ: или в настоящее время, это довольно безопасно использовать #pragma once
как предполагает Донни в комментарии ниже. Это не будет работать в версиях GCC старше 3.4, но, вероятно, вам больше не нужно это поддерживать.