#define RGB(r, g, b) 0xff##r##g##b - probleme



  • Ich habe ein define gemacht:

    #define RGB(r, g, b) 0xff##r##g##b - probleme
    

    wenn ich das aber nun wiefolgt aufrufe

    RGB(00, ff, 00)
    

    bekomm ich die fehlermeldung

    error C2065: 'ff' : nichtdeklarierter Bezeichner



  • Klar weil du an das Makro RGB() einen Wert übergibst der nicht bekannt ist, "ff" sagt dem Compiler nichts.

    Wenn dann musst du 0xFF bzw. 0xff übergeben, dann erkennt der Compiler die Hexadezimalzahl.

    Allerdings hast du dan das Problem, dass du folgendes bei deinem Makro rausbekommst:

    0xFF000xFF00

    Was ja nicht erwünscht ist. Deswegen bastel dir doch am besten die Zahl per Integer-Bitshifting zusammen, in der WinAPI ist dein Makro bereits definiert - dort wurde es so definiert:

    #define RGB(r, g ,b)  ((DWORD) (((BYTE) (r) | \ 
        ((WORD) (g) << 8)) | \ 
        (((DWORD) (BYTE) (b)) << 16)))
    

    Lass dich nicht durch die ganzen Castings verwirren.

    MfG SideWinder



  • BTW: Ich würde ebenfalls Klammern um Varialben in Makros machen, hier ein Beispiel wieso das wichtig sein kann:

    // Falsch
    #define FALSE_MUL(a,b) a*b
    //FALSE_MUL(4+3,5) -> 4+3*5 = 19 ...
    
    // Richtig
    #define MUL(a,b) (a)*(b)
    //MUL(4+3,5) -> (4+3)*(5) = 35 :-)
    

    MfG SideWinder



  • SideWinder schrieb:

    BTW: Ich würde ebenfalls Klammern um Varialben in Makros machen, hier ein Beispiel wieso das wichtig sein kann:

    // Richtig
    #define MUL(a,b) (a)*(b)
    //MUL(4+3,5) -> (4+3)*(5) = 35 :-)
    

    Noch besser ist dann aber

    #define MUL(a,b) ((a)*(b))
    


  • Das ##r müsste er ja durch den bei r übergebenen Parameter ersetzen, ebenso bei g und b, was eigentlich dann so aussehen müsste:
    RGB(00, ff, 00) wird durch
    #define RGB(r, g, b) 0xff##r##g##b
    0xff00ff00

    ich könnt eigentlich schon das von der WinAPI nehmen, bin trotzdem neugierig, warums net funzt



  • Hallo,

    @_gast_: das muß eigentlich funktionieren, mit welchem Compiler arbeitest du? Erscheinen sonst irgendwelche Warnungen? Ist windows.h includiert? (Darf nicht includiert sein, diese Fehlermeldung kommt dann, wenn das RGB-Makro aus windows.h expandiert wird, aber manche Compiler geben dann zumindest eine Warnung aus wegen Neu-Definition des Makros). Benenne das Makro einmal um, z.B. RGB2, und rufe dann RGB2 auf.

    MfG



  • Windows.h hab ich schon drinnen, muss ich auch, aber ich hab vor dem define sowas drinnen:

    #undef RGB
    #define RGB(r, g, b) ...
    

    Wenn ichs nicht drinnen hätt, würd nur 'ne warnung kommen (Makro-Neudefinition)
    Ich verwend Visual Studio 6



  • ok, mit #undef geht's natürlich auch, und das mit der Warnung habe ich schon angedeutet. Und ich kann dir sagen, daß es mit dem Visual C-Compiler hier überhaupt keine Probleme gibt, denn den verwende ich auch (und bei mir funktionieren ähnliche Makros). Also muß bei dir noch eine Besonderheit vorliegen, die ich aber aus deinen bisherigen Angaben nicht erkennen kann. Wie rufst du denn das Makro auf? Wie sehen die #include-Anweisungen in der Datei aus, in der das Makro definiert wird, in welcher Reihenfolge stehen sie vor dem #undef und danach? Hast du versucht, das Makro umzubenennen, ob dann der gleiche Fehler immer noch auftritt?

    MfG



  • Ich hab wie Windows.h erst nach der header mit meinem Makro eingebunden!
    habs umgedreht, jetzt klappts
    thx!


Anmelden zum Antworten