2017-03-10 6 views
0

Ich habe eine Header-Datei, die ein Include-Guard-Setup enthält. Ich habe mehrere C-Dateien in meinem Projekt, die diese Header-Datei für die Kompilierung benötigen. Wenn ich jedoch kompiliere, bekomme ich eine Fehlermeldung, dass die Funktion bereits aus einer anderen Datei enthalten ist. Sollte dies nicht durch den Wächter verhindert werden? In der Theorie glaube ich, dass ich in der Lage sein sollte, diese Datei ein paar Mal zu importieren und dieses Problem nicht zu haben.C Problem mit Include-Wachen

#ifndef __BST_INCLUDED 
#define __BST_INCLUDED__ 

//bunch of code here 

#endif 

Fehler:

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

Vielleicht verwenden Sie '#pragma once' –

+2

Betreffend __BST_INCLUDED, fürchten Sie den doppelten Unterstrich! [Double Unterstrich ist für die Verwendung durch die Bibliothek-Implementierung reserviert] (http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-ac-identifier) ​​Schlecht und wirklich Wenn du das tust und mit einem Bibliotheksidentifikator kollidierst, kann es passieren, dass es zu ausgeflippten, schwer zu debuggenden Dingen kommt, also tu es einfach nicht. – user4581301

+0

@ user4581301: So ist ein einzelner Unterstrich im Dateibereich. – Olaf

Antwort

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

Dies wird nicht alles schützen. Aus dem einfachen Grund, dass __BST_INCLUDED__ ist nicht das gleiche wie __BST_INCLUDED, und __BST_INCLUDED wird nie definiert.

Aber auch:

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: 

diese Fehler nicht sagen Ihnen, dass „die Funktion aus einer anderen Datei aufgenommen wurde“, es ist ein völlig unabhängigen Fehler. Der "included from" -Teil sagt Ihnen nur, wie der Compiler zu der Zeile gekommen ist, die danach angezeigt wird (was in der Frage fehlt).

+0

Ja die andere Datei vbst.h enthält bst.h. Ich habe nicht verstanden, dass die 2 Zeilen anders waren. Danke, das hat es gelöst. – PleaseNoBugs

0

Ihre Include-Wachen sind in Ordnung. Das Problem ist, dass Sie mehrere verschiedene Signaturen für die pruneBSTNode-Funktion deklariert haben. Stellen Sie sicher, dass die Header- und die C-Datei für den Rückgabetyp und die Argumenttypen übereinstimmen.

0
__BST_INCLUDED 

nicht das gleiche wie

ist
__BST_INCLUDED__. 

Außerdem, wenn es um die Erstellung Header kommt, ist meine Empfehlung, dass Sie häufiger Konvention für Ihre umfassen Wachen

#ifndef FILE_NAME_HPP 
#define FILE_NAME_HPP 


#endif 

Aber verwenden ach , wie die anderen sagten. Dein Fehler kommt nicht von dort.