2010-08-18 5 views
17

Сегодня я столкнулся с этой проблемой и просто задался вопросом, как определить где-то определенный тип, определенный с помощью typedef. Чтобы привести пример, я начал использовать библиотеку Xerces-c3, которую я построил из исходного кода, и написал конвертер xml2text. Но я не смог найти порт Xerces-c3 на fbsd, поэтому была установлена ​​библиотека Xerces-c2.Как проверить, является ли тип данных «определен» с typedef

Когда я попытался перекомпилировать исходный код, который я получил следующую ошибку:

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*) 

Я использую следующее определение в моем файле заголовка для метода writeChars

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

Я проверил, что XMLSize_t не что иное, unsigned int объявлено следующим образом:

#define XERCES_SIZE_T size_t 
typedef XERCES_SIZE_T XMLSize_t; 

Так что если я хочу мак e код, совместимый с обеими библиотеками, как я это сделаю? Один из способов, который я могу придумать, - проверить, есть ли версия библиотеки и определить XMLSize_t соответственно. Любым другим путем?

Спасибо,

Shripad

ответ

8

Невозможно напрямую определить, определен ли тип typedef. Самое популярное решение - проверить, определяет ли файл, определяющий typedef, макрос.

например. Тип "struct tm" определяется во времени. Если вы посмотрите на свою копию time.h, в верхней части будет макрос. В версии VC2010 это «_INC_TIME», так что вы можете написать

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

Если тип вы заинтересованы в определяет макрос, то вы можете проверить это.

+0

Япа, решить эту проблему, выполнив следующие действия: я обнаружил, что этот тип объявлен в Xerces_autoconf_config.hpp который вводится в xerces-c3, но его нет в xerces-c2. Так было сделано следующее: #ifndef XERCES_AUTOCONFIG_CONFIG_HPP #define XMLSize_t unsigned int #endif –

0

Не уверен, как вы бы идти о проверке определений типов, но если Theres макрос можно определить в файл с ЬурейиМ, вы можете проверить условия, заданные с #ifdef

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

+0

Да, я знаю, если его определить с макро я могу легко сделать следующий #ifndef XMLSize_t #define XMLSize_t неподписанного Int #endif –

Смежные вопросы