2010-04-21 4 views
6

Dans ma base de code, je trouve que deux modules ont des structures avec le même nom. Il donne une erreur de conflit de nom. Y a-t-il un moyen de le résoudre sans changer le code?Comment résoudre deux structures avec le même nom?

+0

Qu'est-ce qui ne va pas avec le changement de code? –

+0

Si je pouvais avoir, je l'aurais fait. :) Désolé Neil, Dans mon cas ce n'est même pas une option. J'intègre deux modules différents, à la fois hors de mon contrôle et ils le causent. – Jay

Répondre

9

C'est un terrible hack, mais il serait possible d'utiliser une macro pour redéfinir le nom du struct, comme si

// a.h 
struct collide { 
    int a; 
}; 

// b.h 
struct collide { 
    float b; 
}; 

// test.c 
#define collide a_collide 
#include "a.h" 
#undef collide 
#include "b.h" 
int main(){ 
    struct a_collide a; 
    struct collide b; 
    return 0; 
} 

Vous voudrez probablement renommer le struct pour les en-têtes pour donner erreurs quand quelqu'un utilise inévitablement la mauvaise struct, peut-être dans un en-tête d'emballage comme

// wrap_a.h 
#define collide a_collide 
#include "a.h" 
#undef collide 

Rappelez-vous undef la macro afin de ne pas remplacer au hasard tout au long de votre code.

+0

Je ne le dirais pas si terrible hack. Une fois j'ai dû inclure deux scanners Lex dans mon programme et ils se sont affrontés sur un grand nombre de symboles, alors j'ai utilisé un truc similaire et ça a marché comme un charme. – qrdl

+0

Je pense que ce dont vous avez plus à vous soucier, c'est que quelqu'un soit perturbé par le changement de nom des structures, car il est probable que ces noms contradictoires proviennent d'une source externe. La documentation pour les appels de fonction, etc. ne correspondrait plus aux prototypes réels, de sorte que tous les utilisateurs devraient être clairs sur ce qui s'est passé. –

1

Je ne pense pas vraiment à de bonnes idées. Voici deux pas si bons:

  • Si vous êtes très chanceux, vous pouvez séparer votre code de sorte qu'aucun module de tous les besoins d'accéder à deux types de structures à un moment donné, alors seulement comprennent les en-tête approprié, et vous partez. Ceci est un péril et sera un cauchemar de maintenabilité: quiconque viendra après vous aura des raisons de maudire votre nom et tous vos descendants jusqu'à la septième génération. Si le code est c89ish, vous pouvez essayer de compiler avec un compilateur C++ et d'encapsuler une ou plusieurs des structures incriminées dans un espace de noms. Cela introduit des problèmes de toutes les petites différences pointilleuses dans les deux langues (règles de casting, class comme un mot réservé, etc ...), de sorte qu'il viole presque certainement votre demande de ne pas changer le code.

Bonne chance.