2009-04-20 7 views
2

Ich brauche eine Reihe von Wrapper um die Standard-System-Anrufe-öffnen, zu hören, etc. Für diese habe ich ein paar „#define“ wie in:suppress gcc warnings: "Warnung: Dies ist der Ort der vorherigen Definition"

#define open(a,b,c) JCL_Open(a,b,c) 

Aber wenn ich den Header und die damit verbundenen .c-Dateien zu kompilieren, ich bin die folgende Warnung erhalten:

/jcl_wrappers.h:114 : 1: Warnung: "offen" neu definiert
/jcl_wrappers.h:113:1: Warnung: Dies ist der Ort der vorherigen Definition

Wie kann ich diese Warnungen unterdrücken?

Antwort

5

Setzen Sie include guards in Ihre Header-Datei.

Grundsätzlich müssen Sie diese zwei Zeilen am Anfang der Headerdatei

am Ende
#ifndef _yourincludefilename_h_ 
#define _yourincludefilename_h_ 

und

#endif /* _yourincludefilename_h_ */ 

setzen von Ihnen Datei enthalten.

Bearbeiten:
Rasche ist richtig, das Öffnen ist kein guter Name für ein Makro, da es mit einer Bibliotheksfunktion kollidieren wird. Normalerweise ist es eine gute C-Konvention Makros alle Groß zu machen, so würde ich vorschlagen, Ihr Makro

#define OPEN(a,b,c) JCL_Open(a,b,c) 

zu ändern oder sogar besser

#define XYZ_OPEN(a,b,c) JCL_Open(a,b,c) 

wo XYZ ist ein Präfix speziell für Ihren Code.

+0

Eine Menge Legacy-Quellcode verwendet diesen Trick, um insbesondere Bibliotheksfunktionen durch eigene zu ersetzen. lib9 in golang.org Quellen, um einen zu benennen. Es wäre schön, wenn eine Befehlszeile wie "WNO-builtin-macro-redefined" geändert wird. Ich habe es auch nicht gefunden. – user222202

0

Wickeln Sie die definieren in:

#ifndef JCL_WRAPPERS_H 
#define JCL_WRAPPERS_H 

... your macro's 

#endif 

Dies stellt sicher, dass Ihre Makros nur einmal definiert werden, wenn Sie Ihre Header an mehreren Stellen einschließlich.

Es ist generell eine kluge Sache, für alle Prototypen in den Titeln auch zu tun.

4

Lassen Sie die Standardfunktionen allein und benennen Sie die Funktion:

#define myopen(a,b,c) JCL_Open(a,b,c) 

Jemand wird Ihnen später danken.

1

Sie könnten versuchen, Compile-Wächter zu verwenden. Wie:

my_headers.h:

#ifndef __MY_HEADERS 
#define __MY_HEADERS 

    #define open(a,b,c) JCL_Open(a,b,c) 

#endif 

Dies wird nur tun, was zwischen dem #ifndef und #endif wenn die '__MY_HEADERS' Makro definiert wurde. Daher wird alles in Ihrer .h-Datei nur einmal deklariert.

Sie könnten das gleiche Konstrukt verwenden, um zu sehen, ob das Makro "open" bereits definiert ist.

Beachten Sie auch, dass es bereits eine C-Funktion namens open() gibt: http://www.manpagez.com/man/2/open/.Vielleicht ist es keine gute Idee, den gleichen Namen für Ihr Makro zu verwenden!