#ifdef verschachteln



  • Hallo zusammen,

    weiss jemand vielleicht wie man #ifdef- Anweisungen verschachtelt?

    Wenn ich z.B:

    #ifdef AUF1
          #ifdef AUF2
           irgendwas1
          #endif
          #ifdef AUF3
           irgendwas2
          #endif
          #endif
    

    Wenn ich jetzt

    #define AUF1
    

    und

    #define AUF3
    

    da stehen habe, wird dann irgendwas2 ausgeführt oder wie läuft das allgemein?

    Danke im Voraus,

    Laura



  • Ja.



  • #ifdef AUF1
    
          #ifdef AUF2
    
               irgendwas1
    
          #endif //END FOR AUF2
    
          #ifdef AUF3
    
               irgendwas2
    
          #endif //END FOR AUF3
    
    #endif //END FOR AUF1
    

    Damit irgendwas2 ausgeführt wird, muss AUF3 und AUF1 definiert werden (Wert selbstverständlich unwichtig). Für irgendwas1 statt AUF3 AUF2.
    Das ist wie bei If-Verschachtelung.
    Formattierung nicht vergessen!



  • Danke zusammen. Mit Formattierung meinst du Zeileneinrückung, oder ...? Muss man bei solchen Sachen aufpassen wenn das #define in anderen Funktionen definiert ist, oder wie läuft das allgemein? Danke nochmal.



  • #define macht nichts zur Laufzeit, sondern auf reiner Text Ebene bevor überhaupt etwas kompiliert wird.

    Das kannst du dir vorstellen, dass da jemand von Hand drüber geht und einfach Quellcode weglöscht, wenn etwas nicht in einem define Block ist.



  • drakon schrieb:

    #define macht nichts zur Laufzeit, sondern auf reiner Text Ebene bevor überhaupt etwas kompiliert wird.

    Das kannst du dir vorstellen, dass da jemand von Hand drüber geht und einfach Quellcode weglöscht, wenn etwas nicht in einem define Block ist.

    Gänau. Das bedeutet, dass alle Präprozessor-Direktiven vor'm Kompilieren verschwinden; manchmal vertun sich Anfänger mit Include-Guards (z.B. gegenseitige Implementierung von Quell-Headern), o.ä..

    Muss man bei solchen Sachen aufpassen wenn das #define in anderen Funktionen definiert ist, oder wie läuft das allgemein? Danke nochmal

    .

    Tjo. Wenn die Funktions-definition vom Compiler interpretiert wird, existieren die Präprozessor-Direktiven nicht mehr...



  • Laura G. schrieb:

    [...] Muss man bei solchen Sachen aufpassen wenn das #define in anderen Funktionen definiert ist, oder wie läuft das allgemein? Danke nochmal.

    define s in Funktionen definieren??? WTF?



  • #define ist eine Präprozessor (google) Anweisung, eine reine Textersetzung. #defines haben keinen Scope, daher ist es mehr als unüblich so etwas innerhalb von Funktionen zu verwenden. Für Konstanten sind konstante Variablen da:

    void foo()
    {
      const int size = 5;
      ...
    }
    

    Die Konstanten aus der Standardbibliothek sind Überbleibsel von C, da da Folgendes nicht möglich war:

    void foo()
    {
      const int size = 5;
      char a[size]; // In C89 nicht möglich, in C++ schon. Daher nutzt man in C oft #defines
    }
    


  • Kann die Schachtelung auch beliebig weiter in die Tiefe gehen?

    Wie z.B::

    
    

    #ifdef AUF1
    #ifdef AUF2
    irgendwas1
    #endif
    #ifdef AUF3
    irgendwas2
    #endif
    #ifdef AUF4
    irgendwas3
    #endif
    #endif [code]

    Wenn nun #define AUF1 und #define AUF4 gilt, dann wird irgendwas3 ausgeführt?



  • Ja.



  • Nein.

    Beliebig tief kann soweit ich weiss kein Compiler, und ist auch nicht vorgeschrieben. Und auch nicht nötig.

    Im C++ Standard gibt es auch überhaupt nur eine Empfehlung was eine Implementierung können sollte. Was die Verschachtelungstiefe von "conditional inclusion" ("Präprozessor-ifs") angeht ist diese Empfehlung 256.



  • Swordfish schrieb:

    define s in Funktionen definieren??? WTF?

    void func()
    {
    #define TEST
    #ifdef TEST
    	...
    #else
    	...
    #endif
    }
    

    Ist also WTF?



  • hustbaer schrieb:

    Nein.

    Beliebig tief kann soweit ich weiss kein Compiler, und ist auch nicht vorgeschrieben. Und auch nicht nötig.

    WTF? DAs kann nicht sein, schließlich kannst du doch ziemlich alles (zum Beispiel Schleifen oder if-Abfragen) únendlich verschachteln...



  • Hacker schrieb:

    hustbaer schrieb:

    Nein.

    Beliebig tief kann soweit ich weiss kein Compiler, und ist auch nicht vorgeschrieben. Und auch nicht nötig.

    WTF? DAs kann nicht sein, schließlich kannst du doch ziemlich alles (zum Beispiel Schleifen oder if-Abfragen) únendlich verschachteln...

    Nein. Mal abgesehen davon dass das eine mit dem anderen nichts zu tun hat:

    1. Compiler != Präprozessor. Nirgendwo steht, dass der Präprozessor seine #if's genauso tief schachteln können muss wie der Compiler
    2. Präprozessorschachtelung kann durchaus begrenzt sein. Auf einem hinreichend großen Level, so dass du schon ne Menge #if's schachteln musst, wenn du da an die Grenzen stoßen willst.
    3. Scope-Schachtelung ist auch begrenzt. Du wirst nur in halbwegs sinnvollem Code nicht soweit kommen, dass du genügend if's, for's oder while's etc. schachtelst, um die Grenze zu finden.

Anmelden zum Antworten