начинающий программист 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
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, но, вероятно, вам больше не нужно это поддерживать.
Других решений пока нет …