Laufzeitvariable mit Preprozessor directive abfragen

  • C#

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von thefiloe.

    Laufzeitvariable mit Preprozessor directive abfragen

    Guten Abend,

    ich habe im Moment folgendes Konstrukt

    C#-Quellcode

    1. #if DEBUG
    2. if (Variable)
    3. {
    4. // ...
    5. }
    6. #endif


    Ich dachte mir, ich könnte ohne weiteres, eine Laufzeit -Variable, in der Preprozessor -Direktive mit abfragen. Dies funktioniert leider nicht. Gibt es hier eine möglichkeit die Laufzeit -Variable in der Preprozessor -Direktive abzufragen?
    Jo.

    Falls die Arbeitsweise eines Präprozessors unklar sein sollte: Der macht nichts anderes als Text ersetzten. In .NET-Sprachen wird der aber kaum eingesetzt, daher beziehe ich mich in Beispielen auf C.

    1. Präprozessor, um Codestücken Namen zu geben.
    Mittels #define kann man Konstanten definieren und (optional) Werte geben. Beispiel:

    C-Quellcode

    1. #define FOO_BAR 42
    2. int main() {
    3. printf("Zahl: %d\n", FOO_BAR);
    4. return 0;
    5. }
    Der Präprozessor macht daraus:

    C-Quellcode

    1. int main() {
    2. printf("Zahl: %d\n", 42);
    3. return 0;
    4. }


    2. Präprozessor, um Dateien einzubinden.
    Vielleicht ist dem geneigten C-Programmierer aufgefallen, dass dies so nicht kompiliert werden kann. Dem Compiler fehlt die Deklaration von printf. Und hier kommt ein weiteres Feature des Präprozessors ins Spiel: #include. Include liest die angegebene Datei und setzt ihren Inhalt an die Stelle des Includes. So ist das Beispiel dann auch kompilierbar:

    C-Quellcode

    1. #include <stdio.h>
    2. #define FOO_BAR 42
    3. int main() {
    4. printf("Zahl: %d\n", FOO_BAR);
    5. return 0;
    6. }


    3. Präprozessor, um nur bestimmte Codeteile zu kompilieren.
    Was passiert denn, wenn ich dem C-Compiler zwei gleiche Funktionsprototypen (Deklarationen) anbiete? Richtig, er schmeißt einen Fehler. Und was passiert, wenn ich ​stdio.h zweimal einbinde? Er kompiliert gemütlich weiter. Doch wie kann das sein, stdio.h deklariert doch Funktionen? Ganz einfach: stdio.h benutzt Include-Guards:

    C-Quellcode

    1. ​#ifndef __TEST_H__
    2. #define __TEST_H__
    3. void test();
    4. #endif // __TEST_H__
    Die Funktionsweise ist sehr einfach: Zeile 1 prüft, ob ​__TEST_H__ definiert (#define) wurde. Wenn ja, geht es in Zeile 4 weiter, wenn nein in Zeile 2. Zeile 2 definiert nun ​__TEST_H__, Zeile 3 deklariert die Funktion. Beim nächsten Include ist __TEST_H__ immer noch definiert, und somit wird Zeile 1-4 ignoriert bzw. nicht eingesetzt. Der Präprozessor kennt übrigens einige Direktiven dafür: #if​ (macht weiter, wenn die Bedingung ungleich ​0 (Null) ist), ​#else (Alternative, falls 0 (Null)), ​#elif (ein Else-If), #ifdef und #ifndef (falls definiert bzw. nicht definiert) und ​#endif. Präprozessor-Ifs können nur mit Defines arbeiten.

    Es gibt noch weitere Direktiven, aber dies sind die wichtigsten bzw. die am meisten verwendeten. Wer mehr darüber wissen will, sollte sich die Seiten dazu im MSDN ansehen.
    Ein Präprozessor muss übrigens nicht zwingend auf Code arbeiten. Man kann ihn auch benutzen, um bspw. Textdateien (hier etwa Serienbriefe) zu verarbeiten.
    Mit freundlichen Grüßen,
    Thunderbolt
    Nö die Funktionsweise ist mir klar, ich hab gestern allerdings gelesen das es sich bei dem Preprozessor des c# Compilers im grunde genommen garnicht um einen Preprozessor handelt (zumindest um keinen Physikalischen). Dadurch ist kurz die Hoffnung gekeimnt, ich könnte die oben gezeigte Abfrage mit mir unbekannten workarounds o.ä. in die Direktive einbinden.