Как проверить, определен ли тип данных с помощью typedef - PullRequest
17 голосов
/ 19 августа 2010

Я столкнулся с этой проблемой сегодня и просто удивляюсь, как проверить, действительно ли где-то определен новый тип, определенный с помощью 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 соответственно. Любым другим путем?

Спасибо

Шрипад

Ответы [ 2 ]

9 голосов
/ 19 августа 2010

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

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

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

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

0 голосов
/ 19 августа 2010

Не уверен, как вы будете проверять typedefs, но если есть макрос, который вы можете идентифицировать в файле с помощью typedef, вы можете проверить операторы define с помощью #ifdef

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

...