2017-03-10 1 views
0

J'ai un fichier d'en-tête qui inclut une configuration de garde. J'ai plusieurs fichiers C dans mon projet qui nécessitent ce fichier d'en-tête pour la compilation. Quand je vais compiler cependant j'obtiens une erreur disant que la fonction a déjà été incluse d'un autre dossier. La garde d'inclusion ne devrait-elle pas empêcher ceci de se produire? En théorie, je crois que je devrais pouvoir importer ce fichier plusieurs fois et ne pas avoir ce problème.C Problème avec les protections incluses

#ifndef __BST_INCLUDED 
#define __BST_INCLUDED__ 

//bunch of code here 

#endif 

Erreur:

bst.h:22:13: error: conflicting types for ‘pruneBSTNode’ 
extern void pruneBSTNode(bst *tree,bstNode *node); 
      ^
In file included from vbst.h:5:0, 
       from bstrees.c:7: 
+0

Peut-être utiliser '#pragma once' –

+2

En ce qui concerne __BST_INCLUDED, craignez le double trait de soulignement! [Double soulignement est réservé à l'utilisation de la bibliothèque de mise en œuvre] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier) ​​Bad et vraiment bizarre, difficile de déboguer les choses peuvent arriver si vous le faites et entrer en collision avec un identifiant de la bibliothèque, alors ne le faites pas. – user4581301

+0

@ user4581301: Il en est de même d'un trait de soulignement unique au niveau du fichier. – Olaf

Répondre

5
#ifndef __BST_INCLUDED 
#define __BST_INCLUDED__ 
//bunch of code here 
#endif 

Cela ne protège rien. Pour la simple raison que __BST_INCLUDED__ n'est pas la même chose que __BST_INCLUDED, et __BST_INCLUDED ne sera jamais défini.

Mais aussi:

bst.h:22:13: error: conflicting types for ‘pruneBSTNode’ 
extern void pruneBSTNode(bst *tree,bstNode *node); 
     ^
In file included from vbst.h:5:0, 
       from bstrees.c:7: 

cette erreur ne vous dit pas que « la fonction a été inclus à partir d'un autre fichier », il y a une erreur sans aucun rapport. La partie "inclus de" vous indique simplement comment le compilateur est arrivé à la ligne affichée après (ce qui manque dans la question).

+0

Oui l'autre fichier vbst.h inclut bst.h. Je n'ai pas compris que les 2 lignes étaient différentes. Merci qui l'a résolu. – PleaseNoBugs

0

Vos gardes d'inclusion sont corrects. Le problème est que vous avez déclaré plusieurs signatures différentes pour la fonction pruneBSTNode. Assurez-vous que l'en-tête et le fichier .c sont d'accord sur le type de retour et les types d'argument.

0
__BST_INCLUDED 

n'est pas la même chose que

__BST_INCLUDED__. 

D'ailleurs, quand il s'agit de compilant les en-têtes, ma recommandation est que vous utilisez la convention plus commune pour vos inclure les gardes

#ifndef FILE_NAME_HPP 
#define FILE_NAME_HPP 


#endif 

Mais hélas! , comme les autres l'ont dit. Votre erreur ne vient pas de là.