Как проверить, определен ли тип данных с помощью typedef
Сегодня я столкнулся с этой проблемой и просто задался вопросом, как проверить, действительно ли определен какой-то новый тип, определенный с помощью typedef. Чтобы привести пример, я начал использовать библиотеку Xerces-c3, которую я построил из исходного кода, и написал конвертер xml2text. Но я не смог найти порт Xerces-c3 на fbsd, поэтому была установлена библиотека Xerces-c2.
Когда я попытался перекомпилировать исходный код, я получил следующую ошибку:
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;
Итак, если я хочу сделать код совместимым для обеих библиотек, как я это сделаю?
Один из способов, который я могу придумать, - проверить, соответствует ли версия библиотеки и определить XMLSize_t
. Любым другим путем?
Спасибо,
Shripad
Ответы
Ответ 1
Невозможно напрямую определить, определен ли typedef. Самое популярное решение - проверить, определяет ли файл, определяющий typedef, макрос.
например. Тип "struct tm" определяется во времени. Если вы посмотрите на свою копию time.h, в верхней части будет макрос. В версии VC2010 это "_INC_TIME", поэтому вы можете написать
#if !defined(_INC_TIME)
// Do whatever
#endif
Если интересующий вас тип определяет макрос, вы можете проверить его.
Ответ 2
Не уверен, как вы собираетесь проверять typedefs, но если макрос, который вы можете идентифицировать в файле с помощью typedef, вы можете проверить инструкции define с помощью #ifdef
http://gcc.gnu.org/onlinedocs/cpp/Ifdef.html