Häufig hat man die Situation, dass auf einer Seite sich einige Makros gegenseitig ausschließen, aber auf der anderen Seite eins davon obligatorisch ist.
Zum Beispiel, das Programm verwendet eine Datenbank - entweder die DB2 oder Informix oder MySQL oder Oracle oder geht über ODBC. Über die Makros (beispielsweise DB_DB2, DB_INFORMIX, DB_MYSQL, DB_ORACLE, DB_ODBC) steuert man, welche Code-Abschnitte je nach verwendete DB kompiliert werden sollen.
Das heißt:
Hier ist ein Beispiel, wie man zur Kompilierungszeit prüft, ob die o.g. Bedingungen erfüllt sind (Big- und Little-Endian schließen sich gegenseitig aus):
#undef BYTE_ORDER // 1 = big-endian, -1 = little-endian, 0 = unknown #if defined ARCH_IS_BIG_ENDIAN #define BYTE_ORDER (ARCH_IS_BIG_ENDIAN ? 1 : -1) #elif defined ARCH_IS_LITTLE_ENDIAN #define BYTE_ORDER -1 #else #define BYTE_ORDER 0 #endif // ARCH_IS_BIG_ENDIAN und ARCH_IS_LITTLE_ENDIAN dürfen nicht beide gleichzeitig definiert sein. #if defined ARCH_IS_BIG_ENDIAN && defined ARCH_IS_LITTLE_ENDIAN #error Nur eine der beiden Definitionen (ARCH_IS_BIG_ENDIAN, ARCH_IS_LITTLE_ENDIAN) erlaubt #endif // Eine davon muss jedoch definiert sein. #if !defined ARCH_IS_BIG_ENDIAN && !defined ARCH_IS_LITTLE_ENDIAN #error Mindestens eine der beiden Definitionen (ARCH_IS_BIG_ENDIAN, ARCH_IS_LITTLE_ENDIAN) muss definiert sein #endif
Stand: 27.01.2016
EOF