Folgendes Programm beachten. Wird dies zu Kompilierungsfehlern führen?Was ist der Grund für die vorläufige Definition in C?
Auf den ersten Blick scheint der Compiler einen variablen Redefinitionsfehler zu haben, aber das Programm ist nach dem C-Standard perfekt gültig. (Siehe Live-Demo hier http://ideone.com/Xyo5SY).
Eine vorläufige Definition ist eine externe Datendeklaration, die keinen Speicherklassenspezifizierer und keinen Initialisierer hat.
C99 6.9.2/2
Eine Deklaration einer Kennung für ein Objekt, das ohne einen Initialisierer fi le Umfang hat, und ohne eine Speicherklasse spezifischen ER oder mit dem Speicherklasse spezifischen er statisch, stellt eine vorläufige Definition dar. Wenn eine Übersetzungseinheit eine oder mehrere vorläufige Definitionen für einen Identifier enthält und die Übersetzungseinheit keine externe Definition für enthält, die identisch ist, dann ist das Verhalten genau so, als ob die Übersetzung eine Dateibereichsdeklaration dieses Identifikators enthält der Verbundtyp ab Ende der Übersetzungseinheit, mit einem initializer gleich 0.
Meine Frage ist, was ist Gründe dafür, dass vorläufige Definitionen? Gibt es irgendeinen Gebrauch davon in C? Warum erlaubt C vorläufige Definitionen?
Ich glaube nicht, dass es dafür keine wertvollen Gründe ist, weil C++ selbst hat es noch nie hatte, unter vielen andere Programmiersprachen. – edmz