Makros-Kollisionen

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