Unterschied const #define



  • net schrieb:

    nee, das ist was ganz anderes. der string ist deshalb konstant, weil er in einem read-only bereich gespeichert wird (alles was irgendwo gespeichert wird, hat eine adresse).

    Richtig der Text wird wo gespeichert und hat damit eine Adresse. Meinst du das ist bei "konstanten" Ausdrücken im Quellcode nicht der Fall?
    Denn nichts anderes ist dein Makro:

    #define TEXT "Das ist ein konstanter Text."
    puts(TEXT);
    

    ist es unmöglich den string zur laufzeit zu manipulieren. überall wo TEXT erscheint wird unweigerlich "Das ist ein konstanter Text." eingesetzt. wenn das nicht konstant ist, dann garnix mehr.

    Wie du ja schön berschreibst, überall wo TEXT steht, steht dann beim Compilieren "Das ist ein konstanter Text.", also:

    puts("Das ist ein konstanter Text.");
    

    Und was spricht jetzt dagegen, so vorzugehen?

    char * text = TEXT;
    

    Hoppla, da hat ja dein absolut "konstanter" Ausdruck doch wieder eine Adresse.



  • net schrieb:

    aber was hat es für einen sinn wenn man das 'const' über umwege wegcasten kann?

    Was für einen Sinn haben Haustüren, wenn die Einbrecher sie aufbrechen können?

    Const bietet, wie Bjarne Stroustrup sagen würde, Schutz gegen Zufälle aber nicht gegen Betrug.

    Du darfst das const nicht wegcasten, sofern das dahinterliegende Objekt wirklich als const definiert ist.

    void f(const char *p) { *(char*)p = 'a'; }
    void g(void) {
        const char c = 'c';
        char d = 'd';
    
        f(&d); /* legal */
        f(&c); /* undefiniertes Verhalten */
    }
    

Anmelden zum Antworten