2016-04-30 14 views
2

Ich habe 6.9.3Externe Definition für Bezeichner mit interner Bindung

Es darf nicht mehr als eine externe Definition für jede Kennung mit interner Bindung in einer Übersetzungseinheit deklarierte die folgende Regel in C99-Standard lesen. Wenn ein mit interner Verknüpfung deklarierter Bezeichner in einem Ausdruck verwendet wird (anders als als Teil des Operanden eines Operators sizeof, dessen Ergebnis eine Ganzzahlkonstante ist), muss genau eine externe Definition für den Bezeichner in der Übersetzungseinheit vorhanden sein.

Meine Fragen:

(1) Was genau eine externe Definition ist?

(2) Warum verstößt der folgende Code nicht gegen diese Regel?

static int a = 1; 

int main() 
{ 
    a += 1; 
    return 0; 
} 
+0

Hinweis: C-Standard seit ca. 5 Jahre ist C11, nicht C99. Wenn Sie keinen alten Code pflegen müssen, sollten Sie den aktuellen (und einzigen) Standard verwenden. Über deine Frage: Das wird in jedem guten C-Buch beantwortet. Was hast du versucht, selbst herauszufinden? Warum denkst du/welche Argumente hast du gegen die Regel verstoßen? Und hast du gelesen, was der 'statische' Speicherklassenbezeichner impliziert? Es wird keine externe Definition angezeigt, außer für 'main'. – Olaf

+1

@Olaf Wenn Sie beide Standards gelesen haben, haben sie die gleichen Wörter im selben Abschnitt für diese Frage. Also, warum ist es C99 oder C11? "Es wird keine externe Definition angezeigt, außer main." Das ist genau meine Frage, wenn Sie es ernsthaft gelesen haben. – Loopz

+0

@Olaf Und über was ich getan habe, um die Antwort selbst herauszufinden. Ich verstehe den Unterschied zwischen externer Definition und externer Verknüpfung nicht ganz, und ich googelte den Begriff ohne nützliches Ergebnis. Ich habe tatsächlich ein paar gute C-Bücher gelesen. Ich verstehe einfach nicht die Begriffe und die Sprache, die im Standard verwendet werden. Zufrieden? – Loopz

Antwort

3

Ich glaube, dass Sie bei der Definition externe Definition sind verwirrend, die extern Schlüsselwort verwendet.

Die Definition wird in beiden C99/C11 in der Semantik Teil 6.9 geschrieben:

Diese werden als ‚‚externe‘beschrieben‘, weil sie erscheinen außerhalb jeder Funktion (und damit Dateiumfang haben).

In Ihrem Beispiel wird der Code nicht die Regel verletzt, weil Sie genau eine externe Defintion des Objekts mit interner Bindung, das heißt:

static int a = 1;