Erklärung versus Definition in c

8

Vor kurzem lernte ich etwas über c-Programmierung, was ich interessant fand. Ich hatte gelesen, dass eine Anweisung wie int i=0; die einzige Möglichkeit ist, eine Definition zu erzwingen, während eine Anweisung wie extern int i; eine erzwungene Deklaration impliziert. Eine Anweisung wie int i; wäre kontextabhängig. Aber was passiert, wenn ich das extern mit Initialisierung wie extern int i=13; kombiniere. Der Compiler erzeugt eine Warnung. Aber was regelt diese Regel?

    
Bazooka 08.11.2011, 17:49
quelle

4 Antworten

4

Dies ist eine Kodierungsstil-Warnung .
Das Argument hierfür ist, dass der Code gültig, aber für C extrem unidiomatisch ist, da "extern" im Allgemeinen erwartet wird, dass die Deklaration keine Definition des Objekts liefert.

%Vor%

deklariert und definiert i , While:

%Vor%

deklariert einfach die Variable i .

Ein bestimmter Fehler 45977 wurde in GCC auf der Website angesprochen das gleiche, aber es zeigt immer noch unbestätigten Status.

Der Fehlerbericht weist darauf hin, dass der Code syntaktisch gemäß dem C-Standard ist. Und es hat eine Diskussion, die das im Detail diskutiert.

Für Fans von Standerdese:
Relevante Abschnittsreferenzen sind:
ansi c99 Standard 6.2.2: Verknüpfung von Bezeichnern und
ansi c99 Standard 6.9.2.4

    
Alok Save 08.11.2011 17:51
quelle
4

Wenn Sie eine Variable deklarieren, binden Sie einfach einen Namen an sie.

Wenn Sie eine Variable definieren, reservieren Sie Speicher dafür.

Wenn Sie eine Variable als extern deklarieren, sagen Sie dem Compiler: "Dies ist an anderer Stelle definiert und wird bei der Verbindungszeit verfügbar sein", also ist es in Ordnung, sie zu verwenden.

    
Emilio M Bumachar 08.11.2011 17:52
quelle
0

Extern wird verwendet, wenn Sie von einem bestimmten Programm auf eine bestimmte Variable zugreifen möchten. Da Sie in Ihrem Programm keine Definition dafür haben, gibt Ihr Compiler Ihnen einen Fehler.

    
slonkar 08.11.2011 17:53
quelle
0

In C ist eine Definition nur eine Deklaration, die zufällig Speicher zuweist (sei es, weil sie einen Initialisierer hat oder weil es eine vorläufige Definition ist, die als Definition verwendet wird). Also, alles, was Sie tun können, um eine Deklaration (wie die Angabe hat extern Speicher), können Sie auch tun, um eine Definition.

Beachten Sie, dass dies von C ++ abweicht.

    
ninjalj 08.11.2011 19:24
quelle

Tags und Links