Почему в заголовочных файлах 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, но, вероятно, вам больше не нужно это поддерживать.

Другие вопросы по тегам