Präprocessor wertet seltsam aus: GCC 4.2



  • Hallo Leute,

    ich habe folgendes Problem mit meinem GCC:
    Er scheint ein Präprocessor-#if nicht richtig auszuwerten:

    //Beispiel 1
    //Ich arbeite auf einem MACBook mit XCode.
    //WINDOWS wird nur auf 1 gesetzt, wenn WIN32 definiert ist. In meinem Beispiel //also NICHT!
    #if WINDOWS && USE_ALPHA_BLEND
     //Win-spezifischer Code:
     //Wird berücksichtigt, wenn USE_ALPHA_BLEND 1 ist, auch wenn WINDOWS 0 ist!!!
    #else...
    #endif
    
    //Beispiel 2
    //Ohne USE_ALPHA_BLEND wird der "falsche" Windows-Code nicht mitkompiliert.
    #if WINDOWS 
     //Wird nicht berücksichtigt. Offensichtilich ist WINDOWS wirklich 0
    #else...
    #endif
    

    Kennt jemand diesen Effekt?

    Vielen Dank und viele Grüße
    Sören



  • Ging das nicht so?

    soerenP schrieb:

    #if defined WINDOWS && defined USE_ALPHA_BLEND

    Weil WINDOWS ja nicht 0 oder 1 ist, sondern nix oder 1.



  • Hmm. Kann sein, aber wenn WINDOWS nix ist, dann sollte doch nicht TRUE rauskommen, oder?

    Ausserdem: Wenn ich auf defined prüfe, dann darf ich (oder ein fremd-coder) nirgendwo WINDOWS als 0 definieren, weil es dann ja definiert wäre und erst recht TRUE rauskommt obwohl man das Gegenteil erreichen wollte!?!

    Korrigiert mich, wenn ich falsch liege. Ist nur meine Interpretation der Dinge und hat nichts mit Wissen zu tun 😉

    Danke und viele Grüße
    Sören

    P.S. Ausserdem meine ich, dass ich auch mal Windows als 0 definiert habe und es trotzdem zu dem seltsamen Ergebnis kam. Ich probier das aber nochma aus.


  • Mod

    soerenP schrieb:

    Hmm. Kann sein, aber wenn WINDOWS nix ist, dann sollte doch nicht TRUE rauskommen, oder?

    Nein, dann kommt "WINDOWS" raus. Es wird einfach nichts ersetzt. Und "WINDOWS" ist nicht "0".

    Ausserdem: Wenn ich auf defined prüfe, dann darf ich (oder ein fremd-coder) nirgendwo WINDOWS als 0 definieren, weil es dann ja definiert wäre und erst recht TRUE rauskommt!?!

    Jupp. Schon eine dumme Sache mit den globalen Variablen, gell?

    Was man da machen kann, ist dass du erstmal am Anfang deines Codes prüfst, ob WINDOWS gesetzt wurde und gegebenenfalls ein undef machst.



  • SeppJ schrieb:

    soerenP schrieb:

    Hmm. Kann sein, aber wenn WINDOWS nix ist, dann sollte doch nicht TRUE rauskommen, oder?

    Nein, dann kommt "WINDOWS" raus. Es wird einfach nichts ersetzt. Und "WINDOWS" ist nicht "0".

    Das sieht der Standard in 16.1§4 aber anders.

    After all replacements due to macro expansion and the defined unary operator have been performed, all remaining identifiers and keywords, except for true and false, are replaced with the pp-number 0, and then each preprocessing token is converted into a token.


  • Mod

    Oh, gut zu wissen. In dem Fall jedoch bin ich selber auf eine Erklärung gespannt.



  • Ja, vor allem, weil WINDOWS ja scheinbar als false ausgewertet wird, wenn der "und" Operator weggelassen wird.

    Ick verstehs nicht.

    Vielen Dank soweit
    Sören



  • Ok.

    Hab mich vertan, wenn ich WINDOWS als 0 definiere (if MAC...), funzt es. Find ich aber echt seltsam. Auch, weil es sich da eigentlich um Fremdcode handelt, der des öfteren auf die gleiche Weise im Einsatz sein sollte... Naja...

    Vielen Dank auf jeden Fall
    Sören


Anmelden zum Antworten