Enum in #define



  • Hey,

    Ich hab da mal eine Frage.

    Und zwar habe ich in einem Header File ein typedef enum

    typedef enum months {
      JANUAR = 0,
      FEBRUAR,
      MAERZ,
      APRIL,
      MAI,
      JUNI,
      JULI,
      August,
      September,
      OKTOBER,
      NOVEMBER,
      DEZEMBER,
    
      MAX_MONTHS
    } Months;
    
    #define MAX_MONTHS_YEAR MAX_MONTHS
    

    So und dann meckert mein Compiler rum das er MAX_MONTH nicht kennt.
    Ist nicht definiert. Wie kann man denn auf das enum zugreifen beim compilen?
    Ich will aber nicht das define so schreiben

    #define MAX_MONTHS_YEAR 12
    


  • Wenn dus richtig machst dann wirds auch gehen mit dem enum. MAX_MONTH ist nicht definiert.



  • Was heisst denn richtig hier in dem Fall?
    Was mach ich denn da falsch?



  • Wenn du ein enum hast mit MAX_MONTHS drin dann wird der Compiler auch nicht meckern, dass er das nicht findet.



  • geht unter gcc,clang,vstudio 2010 - und jetzt?



  • Was und jetzt? Gucke ob das enum überhaupt definiert ist, dh ob entsprechende header includet sind.



  • Warnung: »MAX_MONTHS« ist nicht definiert [-Wundef]
     #define MAX_MONTHS_YEAR MAX_MONTHS
    

    Naja der Compiler spuckt ne Warnung raus das es das nicht gibt anscheinend.
    Ich habe auch gelesen das er diesen enum value dann nicht als 12 nimmt sondern nimmt an der waere 0

    dann lohnt sich aber ja kein ifdef was so aussieht

    #ifdef MAX_MONTHS_YEAR > 12
    // do something
    #endif
    

    Ist es denn generell moeglich das er das dann als 12 interpretiert?



  • geht unter gcc,clang,vstudio 2010 - und jetzt?

    wie ich schon geschrieben haben geht das unter allen relevanten Kompilern also zeig uns ein (sehr)kleines kompilierbares Beispiel mit dem es nicht geht sonst kann dir keiner helfen


  • Mod

    Du machst da irgendwelche komischen Sachen. Erstell mal ein vollständiges Beispiel, das den Fehler/Warnung demonstriert.

    Präprozessoranweisungen (also alles mit # am Anfang) werden verarbeitet, lange bevor der Compiler dran ist. Eine Warnung vom Compiler kann sich daher unmöglich auf eine Zeile mit einer Präprozessoranweisung beziehen. Sie kann höchstens darauf hindeuten, dass diese Zeile eventuell die Ursache ist oder mit der Ursache zusammen hängt. Ist das die vollständige Warnung/Fehlermeldung?

    Umgekehrt kann der Präprozessor unmöglich irgendetwas über enums und die Werte von enum-Konstanten wissen, was die Frage zu deinem ifdef beantworten sollte.


Log in to reply