#define vs typedef



  • Hallo Forumsbesucher,

    ich bin gerade dabei, eine statische C- Lib um einen neuen HW- Port zu erweitern, bedeutet anderen Controller sowie anderen Compiler samt IDE.

    Wegen der Unterschiede der Typenbreite werden in einer Datei Ersatztypen angelegt, um mit einheitlichen Wertebereichen arbeiten zu können. Bisher hat das immer so funktioniert:

    typedef char eint8;    // unsigned 8 Bit
    

    , bei diesem Compiler führt das zu

    warning: Static Analysis Rule 12: All file scope declarations should be static
    

    Zwar nur eine Warning, aber mir ist zunächst nicht klar, was sie eigentlich wirklich bedeutet und ob ich sie ohne böse Nebenwirkungen unterdrücken darf.

    Alternativ habe ich defines angelegt

    #define eint8 char
    

    ... und in den Abschnitten, die ich bis jetzt compilieren kann, kehrte Ruhe ein. Ist dieser Frieden trügerisch, darf man das wirklich oder sind auch da Nebenwirkungen zu befürchten?

    Danke für's Mitgrübeln! 😉



  • pointercrash() schrieb:

    bei diesem Compiler führt das zu

    warning: Static Analysis Rule 12: All file scope declarations should be static
    

    Zwar nur eine Warning, aber mir ist zunächst nicht klar, was sie eigentlich wirklich bedeutet...

    der compiler hätte gern, dass du alle objekte ausserhalb von funktionen 'static' machst. das ist 'ne form von kapselung, d.h. die variablen sind in anderen source-files ausser in dem, in dem sie angelegt wurden, nicht sichtbar. wenn du die warnung ignorierst, sollte es eigentlich keine schlimmen folgen haben.
    🙂



  • ~fricky schrieb:

    der compiler hätte gern, dass du alle objekte ausserhalb von funktionen 'static' machst. das ist 'ne form von kapselung, d.h. die variablen sind in anderen source-files ausser in dem, in dem sie angelegt wurden, nicht sichtbar. wenn du die warnung ignorierst, sollte es eigentlich keine schlimmen folgen haben.
    🙂

    Aber das ist ja genau der Gimmick, daß eben alle Module die typedefs verwenden. Von dem OpenSource- Teil habe ich schon einen HW- Port direkt eingesetzt und einen weiteren selbst geschrieben und nie solche Probleme bekommen (zwar andere, aber tut hier nichts zur Sache), mir auch mit "pedantic" und "Wall"- Switches keinen Ärger eingehandelt. Da es kein static typedef gibt, ist das Gemecker wohl eher unsinnig, oder? Ich habe den Warn- Switch gefunden und ihn erstmal ausgeknipst.

    Die zweite Frage war, ob meine Variante mit define Sinn macht; wenn schon auf Präprozessorebene getauscht wird, dürfte das doch auch nicht schaden, bzw. ich frage mich zudem, auf welcher Ebene typedef eigentlich wirklich ansetzt.



  • pointercrash() schrieb:

    Die zweite Frage war, ob meine Variante mit define Sinn macht; wenn schon auf Präprozessorebene getauscht wird, dürfte das doch auch nicht schaden, bzw. ich frage mich zudem, auf welcher Ebene typedef eigentlich wirklich ansetzt.

    'typedef' wird vom compiler ausgewertet, während bei #define vor dem compilieren textersetzungen gemacht werden. ich würde für eigene typen typedef nehmen, das klappt z.b. auch mit enums, arrays, structs, pointern usw. mit #define geht da vieles nicht so gut. ein bekanntes beispiel ist...

    typedef int* int_ptr;
    int_ptr a, b, c;  // a, b und c sind pointer
    
    #define int_ptr int*
    int_ptr a, b, c;  // a ist ein pointer, b und c nicht
    

    🙂



  • pointercrash() schrieb:

    Die zweite Frage war, ob meine Variante mit define Sinn macht; wenn schon auf Präprozessorebene getauscht wird, dürfte das doch auch nicht schaden, bzw. ich frage mich zudem, auf welcher Ebene typedef eigentlich wirklich ansetzt.

    Wenn du define nimmst, dann sind deine Compiler Warnungen Käse. Denn aus

    int8 foo=bar;

    kommt plötzlich ein "float kann nicht in char konvertiert werden".
    und in der ganzen zeile ist kein char sichtbar. sowas nervt beim debuggen ziemlich 😉


Anmelden zum Antworten