C typedef nom conflit

J’ai obtenu 2 fichiers d’en-tête que j’inclus qui ont tous deux typedef du même nom.

Disons aaa.h et bbb.h. Ils venaient de 2 paquets tiers non liés et je n’ai aucun contrôle sur ces 2 fichiers mais je dois les utiliser. Je n’inclus pas directement les deux fichiers, mais ils sont plutôt sous-inclus dans le fichier d’en-tête de niveau supérieur. (ie. j’inclus ah et bh qui les ont inclus respectivement)

Mon programme ne comstackra pas quand ils sont tous les deux inclus à cause du conflit de nom.

Donc, ma solution temporaire est de copier aaa.h dans mon arbre source en supprimant seulement le typedef, appelé myaaa.h. En haut du fichier, je garde le wrapper “#ifndef AAA_H, #define AAA_H” afin que, lorsque j’inclue myaaa.h, aaa.h ne soit pas inclus car le drapeau AAA_H est déjà défini, ce qui a indirectement supprimé le conflit typedef.

Existe-t-il un moyen plus astucieux de faire cela sans append ce fichier (et je dois le contrôler par la version) à mon source?

Merci!

 #define conflicting_typedef aaa_conflicting_typedef #include "aaa.h" #undef conflicting_typedef #define conflicting_typedef bbb_conflicting_typedef #include "bbb.h" #undef conflicting_typedef #define conflicting_typedef ambiguous use aaa_conflicting_typedef or bbb_conflicting_typedef 

Si vous avez besoin de faire référence au typedef de aaa.h , vous pouvez utiliser le nom aaa_conflicting_typedef ; pour faire référence à la typedef de bbb.h , utilisez le nom bbb_conflicting_typedef . Si (comme c’est probablement le cas) vous n’avez pas besoin de faire référence à l’un ou l’autre type dans votre code, alors vous êtes prêt à partir. La dernière #define garantit que vous n’utilisez pas le nom simple; vous devez utiliser le nom mappé correct.

Clairement, cela ne devrait pas être répété; si plusieurs fichiers nécessitent cette strophe, vous le placez dans votre propre en-tête “aaa_bbb.h” et vous l’incluez là où vous avez besoin de la strophe. Vous pouvez même détecter si aaa.h ou bbb.h a déjà été inclus et rejeter la compilation si elle l’a déjà été (vous ne pouvez pas détecter si elles ont été incluses après cela, mais le fait qu’elles aient été incluses une fois sous votre contrôle signifie qu’ils ne doivent plus être inclus).

S’il s’agissait de C ++, vous auriez un problème plus important en raison de la liaison de type sécurisé. OTOH, les vendeurs de bibliothèques sont alors tous deux coupables de contrôle incorrect de l’espace de noms.