2010-04-21 17 views
6

En mi base de código, encuentro que dos módulos tienen estructuras con el mismo nombre. Está dando un nombre de error de conflicto. ¿Hay alguna manera de resolverlo sin cambiar el código?¿Cómo resolver dos estructuras con el mismo nombre?

+0

¿Qué hay de malo en cambiar el código? –

+0

Si pudiera, lo hubiera hecho. :) Lo siento, Neil, en mi caso, eso ni siquiera es una opción. Estoy integrando dos módulos diferentes, ambos fuera de mi control y que están causando. – Jay

Respuesta

9

Este es un terrible corte, pero sería posible usar una macro para redefinir el nombre de la estructura, al igual que

// 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; 
} 

Probablemente usted desea cambiar el nombre de la estructura de ambas cabeceras para dar errores cuando alguien, inevitablemente, utiliza la estructura equivocada, tal vez en un envoltorio de cabecera como

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

Recuerde UNDEF la macro para que no se consigue sustituciones al azar en todo el código.

+0

No lo diría tan terrible hack. Una vez tuve que incluir dos escaners generados por Lex en mi programa y chocaron con una gran cantidad de símbolos, así que usé un truco similar y funcionó como un amuleto. – qrdl

+0

Creo que lo que más te tiene que preocupar es que alguien se confunda con el cambio de nombre de las estructuras, ya que presumiblemente estos nombres discordantes provienen de una fuente externa. La documentación para llamadas a funciones, etc. ya no coincidiría con los prototipos reales, por lo que cualquier usuario debería tener claro lo que sucedió. –

1

No se me ocurren realmente buenas ideas. Aquí hay dos no tan buenos:

  • Si usted es muy afortunado, puede segregar su código para que ningún módulo de todas las necesidades para acceder a ambos tipos de estructura de una sola vez, entonces sólo incluyen la encabezado correcto, y listo. Esto está plagado de peligros y será ser una pesadilla de mantenimiento: cualquiera que venga después tendrá motivo para maldecir su nombre y todos sus descendientes hasta la séptima generación.

  • Si el código es c89ish podría intentar compilar con un compilador de C++ y envolviendo una o más de las estructuras ofensivas en un espacio de nombres. Esto introduce problemas a partir de todas las pequeñas diferencias exigentes en los dos idiomas (reglas de conversión, class como palabra reservada, etc.), por lo que es casi seguro que infringe su solicitud de no cambiar el código.

Buena suerte.

Cuestiones relacionadas