2010-08-18 5 views
17

Me enfrenté a este problema hoy y me preguntaba cómo comprobar si un nuevo tipo definido con typedef está realmente definido en alguna parte. Para dar un ejemplo, comencé a usar la biblioteca Xerces-c3 que construí a partir del código fuente y escribí un convertidor xml2text. Pero no pude encontrar el puerto Xerces-c3 en fbsd así que instalé la biblioteca Xerces-c2.Cómo comprobar si un tipo de datos está "definido" con typedef

Cuando traté de volver a compilar el código fuente Me siguiente error:

XML2Text.cc:83: error: cannot declare variable 'handler' to be of abstract type 'XML2TextHandlers' 
XML2TextHandlers.h:32: note: because the following virtual functions are pure within 'XML2TextHandlers': 
/usr/local/include/xercesc/framework/XMLFormatter.hpp:454: note: virtual void xercesc_2_7::XMLFormatTarget::writeChars(const XMLByte*, unsigned int, xercesc_2_7::XMLFormatter*) 

estoy usando la definición siguiente en mi archivo de cabecera para el método writeChars

virtual void writeChars(const XMLByte* const toWrite, 
         const XMLSize_t count, 
         XMLFormatter* const formatter); 

Comprobé que XMLSize_t no es más que unsigned int declarado con lo siguiente:

#define XERCES_SIZE_T size_t 
typedef XERCES_SIZE_T XMLSize_t; 

Así que si quiero hacer e un código compatible con ambas bibliotecas ¿cómo lo haré? Una forma en que puedo pensar es comprobar si la versión de la biblioteca y definir XMLSize_t en consecuencia. ¿Cualquier otra manera?

Gracias,

Shripad

Respuesta

8

No hay manera de reconocer directamente si se define un typedef. La solución más popular es comprobar si el archivo que define typedef también define una macro.

p. Ej. El tipo "struct tm" se define en time.h. Si miras tu copia de time.h, habrá una macro definida en la parte superior. En la versión VC2010 es "_INC_TIME" para que pueda escribir

#if !defined(_INC_TIME) 
    // Do whatever 
#endif 

Si el tipo le interesa define una macro, entonces usted puede comprobar para eso.

+0

Sí, solucionado el problema haciendo lo siguiente: He encontrado que este tipo declarado en Xerces_autoconf_config.hpp que se introduce en xerces-c3 pero no está en xerces-c2. Lo mismo hizo lo siguiente: #ifndef XERCES_AUTOCONFIG_CONFIG_HPP #define XMLSize_t unsigned int #endif –

0

No está seguro acerca de cómo va a ir sobre la comprobación typedefs, pero si tener una macro se puede identificar en el archivo con el typedef, puede comprobar definir sentencias con #ifdef

http://gcc.gnu.org/onlinedocs/cpp/Ifdef.html

+0

Sí sé si es definida con macro que fácilmente pueden hacer los siguientes #ifndef XMLSize_t #define XMLSize_t unsigned int #endif –

Cuestiones relacionadas