"extern" bringt nur fehler



  • moin
    mein compiler codeblocks kennt kein extern,weil wenn ich

    (0 Errors,3 Warnings)

    #include<iostream>
    extern int a = 2.14;
    int main()
    {
    
        std::cin.get();
    }
    

    oder(1 Error,0 Warnings)

    #include<iostream>
    int main()
    {
        extern int a = 2.14;
        std::cin.get();
    }
    

    schreibe,komm ich einfach nicht weiter 😞
    villeicht aber habe ich was falsch im buch verstanden 😮

    liebe grüße coder



  • Also das erste Programm lässt sich (unter Protest) compilieren und wenn ich es starte tut es exakt was ich erwarten würde.

    😃



  • // a.cpp
    int a = 23;
    
    // b.cpp
    extern int a;
    
    int main(){
      std::cout<<a<<std::endl;
    }
    

    so geht das



  • du kannst eine variable nicht gleichzeitig mit extern deklarieren und initialiseren.

    sowas geht:

    extern int a;
    
    int a = 5;
    

    mfg.



  • joomoo schrieb:

    du kannst eine variable nicht gleichzeitig mit extern deklarieren und initialiseren.

    Doch, das geht durchaus, macht aber keinen Sinn. Der Compiler sollte mindestens eine Warning ausgeben, und u.U. sogar einen Error, wobei es eigentlich gehen sollte (Lippman geht explizit darauf ein, deshalb vermute ich, dass der Standard es erlaubt oder zumindest nicht verbietet, sicher bin ich mir aber nicht).

    Hintergrund ist folgender:
    Durch die Initialisierung ist die Anweisung keine ( extern -)Deklaration mehr, sondern eine Definition. An der Stelle wird, anstatt die Variable "als irgendwo anderst existent" zu kennzeichnen, tatsächlich Speicherplatz angefordert. Dieser Umstand ist natürlich sehr schlecht für header-files, denn dadurch kann es vorkommen, dass die Variable mehrmals definiert wird, wenn die betreffende Datei mehrmals eingebunden wird. Deshalb muss die Initialisierung entfernt werden (und der Compiler meckert völlig zu recht). Aber prinzipiell sollte es möglich sein.



  • proggaholic schrieb:

    Der Compiler sollte mindestens eine Warning ausgeben, und u.U. sogar einen Error

    Was ist denn das für ein Unsinn 😮

    ...unter Umständen sogar ein Error.

    Entweder ist etwas nach Sprachdefinition ein Error oder
    es ist kein Error.

    Wäre ja noch schöner, wenn jeder dahergelaufene Compiler,
    nach Lust, Laune oder Wochentag die Sprachdefinition
    eigenmächtig uminterpretiert.

    Also wirklich ... 🕶



  • Und wenn ich einen Compiler baue, der sich nicht an den Standard hält?

    Nein, eigentlich wollte ich damit nur ausdrücken, dass ich bisher beim kompilieren von diesem Konstrukt entweder nichts oder ein Warning erhalten habe, aber noch nie einen Error, was aber wünschenswert wäre. Ich wollte nur andeuten, dass es sowas vielleicht geben könnte, ich weiss aber nicht, wo und ob.



  • Hallo

    die meisten Compiler bieten eine entsprechende Option, um alle Warnung wie Fehler zu behandeln. In Code::Blocks Menü Project/Build options/Compiler Flags/Treat as erros the warnings...

    bis bald
    akari



  • proggaholic schrieb:

    Und wenn ich einen Compiler baue, der sich nicht an den Standard hält?

    Dann hast du einen Compiler für eine andere Sprache gebastelt.

    proggaholic schrieb:

    ein Warning erhalten habe, aber noch nie einen Error, was aber wünschenswert wäre.

    Das würde bedeuten, daß Code, der korrekt nach der Sprachdefinition
    geschrieben wurde, von diesem Compiler nicht übersetzt werden kann

    akari schrieb:

    die meisten Compiler bieten eine entsprechende Option, um alle Warnung wie Fehler zu behandeln.

    😮 Der Untergang des Abendlands!

    Im Ernst: Ein Compiler darf gerne, wie damals lint, zusätzliche
    Unterstützung durch Warnings geben, aber er soll sich gefälligst an die
    Sprachdefinition halten und nicht, korrekte Programme, nicht übersetzen.



  • Untergang durch höhere Codesicherheit?

    Im Ernst, klar sollen korrekte Programme auch mit ausgegebenen Warnings übersetzt werden, aber was spricht dagegen wenn ich als Entwickler festlege, dass auch Warnungen die Compilierung abbrechen sollen (weil sie sonst vielleicht zu schnell über den Bildschirm huschen oder anderweitig untergehen), damit ich sicheren Code produziere? Schliesslich hat wohl jede Warnung ihre Daseinsberechtigung, und IMHO lässt sich jede Warnung korrigieren ohne (nach dem übersetzen) mehr oder schlechteren Code produziert zu haben.



  • LordJaxom schrieb:

    Schliesslich hat wohl jede Warnung ihre Daseinsberechtigung, und IMHO lässt sich jede Warnung korrigieren ohne (nach dem übersetzen) mehr oder schlechteren Code produziert zu haben.

    Nicht ganz. Wenn du auf einer hohen Warnstufe bist, kommt es zum Beispiel schon mal vor, dass dein Compiler dich vor Situationen warnt, die du logisch gesehen ausschließen kannst.


Anmelden zum Antworten