Präprozessor-Anweisungen

Aus Das Sopra Wiki
Wechseln zu: Navigation, Suche


Was ist eine Präprozessor-Anweisung?

Eine Präprozessor-Anweisung ist eine Anweisung, die das Verhalten des Compilers während des Kompilierungsvorgangs steuert. Man kann dadurch erreichen, dass bestimmte Codeteile nur in bestimmten Build-Konfigurationen kompiliert werden. Ein Beispiel dafür ist das Flag DEBUG, das vom Compiler automatisch gesetzt wird, wenn sich das Programm im Debug-Modus befindet. Dieses Flag kann über die Projekteigenschaften eingestellt werden. Um zum Beispiel nur dann eine MessageBox mit einer auführlichen Fehlermeldung anzuzeigen, wenn das Programm im Debug-Modus ausgeführt wird, kann man folgenden Code verwenden:

    public void SomeFunction()
    {
#if DEBUG
        MessageBox.Show(
		"Fehler bei <InsertStackHere>, bitte John Smith kontaktieren, der sucht diesen Fehler schon lange", 
		"Bitte schnell bei JS melden"
		);
#else
        MessageBox.Show("Es ist ein Fehler aufgetreten.", "Fehler");
#endif
    }

Die Fehlermeldung, man möge John Smith kontaktieren, sehen nur Benutzer der Debug-Konfiguration. Normale Anwender, die normalerweise die Release-Konfiguration bekommen, sehen eine allgemeine Fehlermeldung.

Ein anderer Anwendungsfall ist unterschiedlicher Code für ein XBox 360-Projekt. Im folgenden Beispiel wird auf einer XBox keine Datei auf C:\ angelegt.

    public void SomeOtherFunction()
    {
#if WINDOWS
        File.Open("C:\\test.txt", FileMode.Create);
#endif
    }

Man kann auch negierte Bedingungen angeben. Das obige Beispiel kann man auch folgendermaßen formulieren:

    public void SomeOtherFunction()
    {
#if !XBOX
        File.Open("C:\\test.txt", FileMode.Create);
#endif
    }

Das ! gibt hierbei die Negation an.

Achtung: Präprozessorbefehle werden vom Kompiler vor dem Kompiliervorgang ausgewertet. Das bedeutet, dass Codesegmente, die durch Präprozessor-Anweisungen unsichtbar gemacht werden, nicht im fertigen Kompilat auftauchen. Bei Reverse-Engineering-Ansätzen kann so das ausgeblendete Codesegment nicht wiederhergestellt werden.

Welche Compilerflags gibt es?

DEBUG
Dieses Flag wird gesetzt, wenn das Programm in der Debug-Konfiguration kompiliert wurde.
RELEASE
Dieses Flag wird in der Release-Konfiguration gesetzt.
XBOX oder XBOX360
Dieses Flag wird von XNA in der XBox 360-Konfiguration gesetzt.
WINDOWS
Dieses Flag wird von XNA in der PC (Windows)-Konfiguration gesetzt.

Eigene Compilerflags

Man kann auch eigene Compilerflags setzen. Dies geht auf zwei unterschiedlichen Wegen. Der erste gilt Projektweit, allerdings nicht in der gesamten Solution. In den Projekteigenschaften gibt es den Tab Build. Dort werden eigene Flags unter Contitional compilation symbols eingetragen.

Compilerflags in Visual Studio setzen

Um ein Flag nur in einer Datei zu setzen gibt es #define.

#define FLAG
#if XBOX
#define NOCHEINFLAG
#endif

Im obigen Beispiel wird ein Flag FLAG immer gesetze und auf der XBoX noch das Flag NOCHEINFLAG.

Konvention

Flags werden normalerweise in Großbuchstaben geschrieben. Man beachte, dass Groß- und Kleinschreibung beachtet wird. Die Flags Flag und FLAG sind unterschiedlich.