2016-05-17 34 views
1

ich eine Header-Datei wie mit etwas:#if Nutzung mit Aufzählungen

enum DataRate { 
    AB0, 
    AB1, 
    AB2, 
    ... 
}; 

und in meinem Code habe ich Dinge wie

#define S_FACTOR AB0 

Nun Funktionsaufrufe wie

foo(S_FACTOR); 

scheint zu funktionieren OK, aber bedingte Kompilationen

#if ((S_FACTOR == AB0) || (S_FACTOR == AB2)) 

funktionieren nicht richtig.

Antwort

5

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.

+0

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

+0

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