2017-02-14 2 views
4

--- ac ----Warum gibt es keinen Fehler in diesem Programm?

int i; // external definition 

---- ------ main.c

int i=0; // external definition 

int main(void) 
{ 
i=0; 
} 

In beiden Dateien i ist ein externer defnition in jeder Übersetzungseinheit und i wird in einem Ausdruck verwendet. Das sollte verletzen:

Wenn ein Identifikator mit externer Bindung deklariert wird in einem Expression (ausgenommen als Teil des Operanden von einem Operator sizeof , dessen Ergebnis eine ganzzahlige Konstante), irgendwo in dem gesamten Programm verwendet es soll genau eine externe Definition für den Identifikator geben; sonst wird es nicht mehr sein als one.140)

+1

Wie kompilieren Sie das? –

+0

'int i;' in 'a.c' ist eine * vorläufige Definition *. Siehe [N1570] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) 6.9.2p2. –

+0

Ich benutze 'gcc -Wall -g' – Sabrina

Antwort

2

Dieses Nicht-Standard-Verhalten in vielen C-Compiler implementiert eine gemeinsame Erweiterung.

Dieses Thema wird ausführlich in Rationale to C99 standard (siehe S. 32-34) diskutiert. Und gemäß diesem Dokument wäre dieser Satz von Definitionen legal unter Entspanntes Ref/Def-Modell, das typischerweise in C-Compilern von UNIX OS der Prä-C89-Ära implementiert ist. Dies ist der Grund für seine Popularität und deshalb sehen wir es oft als Erweiterung implementiert. Es soll die Unterstützung von Legacy-Code vereinfachen.

Dennoch Standard-C-Modell-Definition unterscheidet: es ist eine Kombination aus Strikte Ref/Def Modell und Initialization Modell. Standard C erlaubt dies nicht.

P.S. Während es wahr ist, dass die Definition von i in a.c ist eine vorläufige Definition, hat es nichts mit dem Problem zu tun. Am Ende der enthaltenen Übersetzungseinheit werden alle vorläufigen Definitionen eines Objekts kombiniert und ergeben eine externe Definition des Objekts. Ihr "provisorischer" Charakter ist auf der Inter-Modul-Ebene keineswegs sichtbar. Vorläufige Definitionen ermöglichen es nicht, mehrere Definitionen desselben Objekts in verschiedenen Übersetzungseinheiten zu erstellen.

Verwandte Themen