Der Präprozessor weiß nichts über Enums; es ist einfach ein Manipulator von Text. Wenn Sie
#define S_FACTOR AB0
Sie erzählen den Prä-Prozessor das Token S_FACTOR
mit dem Token AB0
und nichts anderes zu ersetzen.
Die Präprozessor-Direktive #if
ist ein bisschen eine Kuriosität. Es tut immer noch wenig mehr als eine Textersetzung, mit der Absicht, sein Argument auf einen arithmetischen Ausdruck mit ganzzahligen Konstanten zu reduzieren. Es beginnt damit, alle definierten Makros im Ausdruck zu ersetzen. Dann ersetzt es jedes verbleibende Bezeichner-Token durch 0 und versucht, den Ausdruck auszuwerten.
So
#if ((S_FACTOR == AB0) || (S_FACTOR == AB2))
wird zunächst auf
#if ((AB0 == AB0) || (AB0 == AB2))
reduziert werden, da S_FACTOR
ein Makro mit einem Ersatz-Liste ist.
Dann ersetzt sie alle Bezeichner mit 0:
#if ((0 == 0) || (0 == 0))
, die sicherlich auf 1 (durch die üblichen C-Semantik für Boolesche Werte) auswertet, so dass der Körper des #if
verarbeitet wird. Aber es wäre genau das gleiche gewesen, wenn S_FACTOR
als AB1
#definiert worden wäre.
Es gibt einen Grund, warum der Präprozessor vor Prozessor genannt wird. Es macht seine Arbeit vor jeder anderen Verarbeitung, einschließlich Deklarationen.
OK, ich verstehe. Wenn ich '#define' zum Einrichten der bedingten Kompilierung verwenden möchte, gibt es ein anderes Schema als nur '#define SNA' und '#define FOO', damit ich später (wie ich es getan habe) einfache Logik ausführen kann? – mike65535
Hmm .. scheint jetzt klar zu sein, ich benutze kein Enum dafür! (Die Enums, die ich verwende, wurden mir in einer .h-Datei zur Verfügung gestellt, also muss ich mir etwas einfallen lassen). **Vielen Dank!** – mike65535