1

programmeur C++ novice ici. J'utilise le code source Recettes numériques (V3) dans le cadre d'un projet C++ modulé plus grand.Pourquoi n'y a-t-il pas de protecteur d'inclusion dans les fichiers d'en-tête Numerical Recipes?

Alors que je vais essayer de ne pas entrer dans les détails de mon problème, je suis curieux de savoir pourquoi ces fichiers d'en-tête NR n'incorporent pas de gardes d'en-tête? Je suis conscient que cette question est très spécifique à ceux qui ont utilisé ce code dans le passé, mais en regardant les forums NR, ils semblent tout à fait inactifs ...

Les erreurs que je trouve avec mon code qui a provoqué cette question sont;

erreur LNK2005: "void __cdecl gaussj (classe NRmatrix &)" déjà défini dans Schmidt_V2_ (Zeta) .obj

erreur LNK2005 (gaussj @@ YAXAAV $ NRmatrix @ N @@@ Z?): " vide __cdecl gaussj (classe NRmatrix &, classe NRmatrix &) »(? gaussj @@ YAXAAV? $ NRmatrix @ N @ @@ 0 Z) déjà défini dans Schmidt_V2_ (Zeta) .obj

+3

Le code recettes numériques n'est pas de la plus haute qualité et c'est un euphémisme. Je crois également qu'il existe de sévères restrictions sur la réutilisation du code. – rubenvb

+1

C'est parce qu'ils sont très méchants. Leur insistance sur les tableaux 1-base (due au port de Fortran) est particulièrement irritante. Mais le code est testé et testé, il vaut donc la peine d'utiliser, parfois. – Bathsheba

+0

Excepté pour être bien débogué dans les parties numériques, Numerical Recipies in * code est fondamentalement un exemple de comment * pas * pour écrire du code. –

Répondre

2

AFAIK il n'y a pas une bonne raison. Il y a quelques situations où vous pourriez légitimement vouloir ne pas utiliser un gardien d'inclusion (voir this question), mais ce n'est pas l'un d'entre eux.

Si vous devez inclure les en-têtes de plusieurs endroits dans votre projet, vous devez présenter vos propres gardes, comme ceci:

#include <a_normal_thing> 
#include <another_normal_thing> 

#ifndef SPECIAL_NONESENSE_H 
#define SPECIAL_NONESENSE_H 
#include <special_nonsense> 
#endif 

// More normal includes... 

Ceci est bavard et ennuyeux, mais ça va marcher.

EDIT: Ou de nos jours, il est assez sûr d'utiliser #pragma once comme Donnie le suggère dans un commentaire ci-dessous. Cela ne fonctionnera pas dans les versions de GCC antérieures à 3.4, mais vous n'avez probablement plus besoin de le supporter.

+1

Ou vous pouvez juste revenir en arrière et mettre '#pragma une fois 'en haut de l'en-tête. Peu importe si quelqu'un d'autre l'a écrit ou non, vous pouvez toujours changer votre copie. – Donnie