2010-08-18 17 views
17

Ich stellte dieses Problem heute und frage mich nur, wie man überprüft, ob ein neuer mit typedef definierter Typ irgendwo definiert ist. Um ein Beispiel zu nennen, habe ich begonnen, die Xerces-c3-Bibliothek zu verwenden, die ich aus dem Quellcode erstellt habe, und einen xml2text-Konverter geschrieben. Aber ich konnte Xerces-c3 Port auf fbsd nicht finden, also installierte Xerces-c2 Bibliothek.Wie man überprüft, ob ein Datentyp mit typedef "definiert" ist

Als ich versuchte, meine Quellcode neu zu kompilieren Ich habe folgende Fehlermeldung:

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

ich für writeChars Methode in meiner Header-Datei folgende Definition bin mit

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

Ich habe, dass XMLSize_t ist nichts anderes als unsigned int mit folgenden deklariert:

#define XERCES_SIZE_T size_t 
typedef XERCES_SIZE_T XMLSize_t; 

Also wenn ich mak e ein Code, der mit beiden Bibliotheken kompatibel ist, wie mache ich das? Eine Möglichkeit, an die ich denken kann, ist zu überprüfen, ob die Version der Bibliothek und XMLSize_t entsprechend definieren. Irgendein anderer Weg?

Danke,

Shripad

Antwort

8

Es gibt keine Möglichkeit, direkt zu erkennen, ob ein typedef definiert ist. Die beliebteste Problemumgehung besteht darin, zu überprüfen, ob die Datei, die den Typdef definiert, auch einen Makro definiert.

z.B. Der Typ "struct tm" ist in time.h. definiert. Wenn Sie sich Ihre Kopie von time.h ansehen, wird oben ein Makro definiert. In der VC2010 Version ist es „_INC_TIME“, so dass Sie

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

Wenn der Typ Sie daran interessiert sind definiert ein Makro schreiben kann, dann können Sie für das überprüfen.

+0

Yup, nach dem Problem dadurch gelöst: fand ich, dass diese Art in Xerces_autoconf_config.hpp erklärt was in xerces-c3 eingeführt wird, aber nicht in xerces-c2. So tat folgendes: #ifndef XERCES_AUTOCONFIG_CONFIG_HPP #define XMLSize_t unsigned int #endif –

0

Nicht sicher, wie Sie über die Überprüfung typedefs gehen würde, aber wenn Theres ein Makro, das Sie in der Datei mit dem typedef identifizieren können, Sie definieren Aussagen mit #ifdef

überprüfen

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

+0

Ja, ich weiß, wenn seine mit Makro definiert ich leicht tun können sich #ifndef XMLSize_t #define XMLSize_t unsigned int #endif –

Verwandte Themen