2009-04-20 18 views
2

J'ai besoin d'un ensemble de wrappers autour des appels système standard - ouvrir, écouter, etc. Pour ces i ont quelques "#define" comme dans:supprimer les avertissements gcc: "avertissement: c'est l'emplacement de la définition précédente"

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

Mais quand je compile l'en-tête et les fichiers associés .c, je reçois l'avertissement suivant:

/jcl_wrappers.h:114 : 1: avertissement: « ouvrir » redéfinie
/jcl_wrappers.h:113:1: Attention, c'est l'emplacement de la définition précédente

Comment puis-je supprimer ces avertissements?

Répondre

5

Mettez include guards dans votre fichier d'en-tête.

Fondamentalement, vous avez besoin de mettre ces deux lignes au début de votre fichier d'en-tête

#ifndef _yourincludefilename_h_ 
#define _yourincludefilename_h_ 

et

#endif /* _yourincludefilename_h_ */ 

à la fin de vous inclure le fichier. Rascher a raison, open n'est pas un bon nom pour une macro, car il entrera en conflit avec une fonction de bibliothèque. Habituellement, il est bon convention C pour faire des macros majuscules, je vous conseille donc de changer votre macro

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

ou mieux encore

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

où XYZ est un préfixe spécifique à votre code.

+0

Un grand nombre de code source hérité utilisent cette astuce, en particulier pour remplacer les fonctions de la bibliothèque par les siennes. lib9 dans les sources de golang.org pour en nommer un. Ce serait bien d'avoir un commutateur de ligne de commande tel que -Wno-builtin-macro-redéfini. J'ai également échoué à le trouver. – user222202

0

Enroulez le définir dans:

#ifndef JCL_WRAPPERS_H 
#define JCL_WRAPPERS_H 

... your macro's 

#endif 

Cela fait que vos macros de ne sont définis une fois si vous y compris votre tête à plusieurs endroits.

C'est généralement une chose intelligente à faire pour tous les prototypes dans les en-têtes aussi.

4

Laissez les fonctions standard seul et renommer la fonction:

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

Quelqu'un vous remerciera plus tard.

1

Vous pourriez essayer d'utiliser des gardes de compilation. Comme:

my_headers.h:

#ifndef __MY_HEADERS 
#define __MY_HEADERS 

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

#endif 

Cela ne le fera faire ce qui est entre si elle a été définie macro les '' __MY_HEADERS la #ifndef et #endif. Ainsi, tout ce qui se trouve dans votre fichier .h ne sera déclaré qu'une seule fois.

Vous pouvez utiliser la même construction pour voir si la macro "ouverte" est déjà définie.

Sachez également qu'il existe déjà une fonction C appelée open(): http://www.manpagez.com/man/2/open/.Peut-être pas une bonne idée d'utiliser le même nom pour votre macro!