Deklaration oder Definition in C

Lesezeit: 4 Minuten

Aus Wiki für externe Variablen:

Wenn weder das Schlüsselwort extern noch ein Initialisierungswert vorhanden sind, kann die Anweisung entweder eine Deklaration oder eine Definition sein. Es obliegt dem Compiler, die Module des Programms zu analysieren und zu entscheiden.

Ich konnte die Bedeutung dieser Aussage in Bezug auf C nicht vollständig erfassen. Bedeutet sie beispielsweise Folgendes:

int i;

ist nicht unbedingt eine Deklaration (wie ich bisher angenommen habe), könnte aber auch eine Definition sein (durch Definition von Definition & Deklaration auf derselben Webseite, keine Wortspiele beabsichtigt)?

Kurz gesagt, ist die obige Aussage: a. nur eine Erklärung, oder b. Deklaration + Definition?

Referenz: Variablendeklaration und -definition

Zusammenfassung der erhaltenen Antworten:

                         Declaration    Definition    Tentative Definition   Initialized 
int i;   (inside a block)    Yes           Yes                No                No
int i=5; (inside a block)    Yes           Yes                No               Yes(to 5)
int i;   (otherwise)         Yes            No               Yes               Yes(to 0)
extern int i;                Yes            No                No                No


All definitions are declarations but not vice-versa.

Benutzer-Avatar
Michael Burr

Angenommen, es befindet sich im Dateibereich, es handelt sich um eine “vorläufige Definition”. Ab 6.9.2/2 “Externe Objektdefinitionen”:

Eine Deklaration eines Bezeichners für ein Objekt mit Dateibereich ohne Initialisierer und ohne Speicherklassenbezeichner oder mit statischem Speicherklassenbezeichner stellt eine vorläufige Definition dar. Wenn eine Übersetzungseinheit eine oder mehrere vorläufige Definitionen für einen Bezeichner enthält und die Übersetzungseinheit keine externe Definition für diesen Bezeichner enthält, dann ist das Verhalten genau so, als ob die Übersetzungseinheit eine Dateibereichsdeklaration dieses Bezeichners enthält, mit dem zusammengesetzten Typ als des Endes der Übersetzungseinheit, mit einem Initialisierer gleich 0.

Das bedeutet, dass es gültig wäre, auch Folgendes in der Übersetzungseinheit zu haben:

int i = 42;

Da diese Deklaration einen expliziten Initialisierer hat, ist es die Definition der Variablen i.

Soweit die Deklaration im Blockbereich erfolgt, sagt die Norm folgendes (6.2.2/2 „Verknüpfungen von Identifikatoren“):

Jede Deklaration eines Bezeichners ohne Verknüpfung bezeichnet eine eindeutige Entität.

(Absatz 6) Die folgenden Bezeichner haben keine Verknüpfung: … ein Blockbereichsbezeichner für ein Objekt, das ohne den Speicherklassenbezeichner extern deklariert wurde.

Im Blockbereich wäre die Deklaration also auch eine Definition.

  • Angenommen, es befindet sich innerhalb eines Blocks (nicht im Dateibereich) …?

    Benutzer191776

    22. Januar 2011 um 18:27 Uhr


  • @crypto: Die Antwort wurde aktualisiert, um eine Blockbereichsdeklaration abzudecken.

    – Michael Burr

    22. Januar 2011 um 18:52 Uhr

  • Danke für die ausführliche Antwort. Ich habe die Antwort von Bavarius ausgewählt, da sie direkter ist.

    Benutzer191776

    22. Januar 2011 um 19:04 Uhr


  • @crypto: Das zu beachtende Detail ist das Sehen int i; könnte den Eindruck erwecken i initialisiert wird 0 – aber das kann nicht der Fall sein.

    – Michael Burr

    22. Januar 2011 um 19:52 Uhr

  • Ich habe das jetzt in der Zusammenfassung hinzugefügt, bitte bearbeiten Sie es, wenn es falsch ist.

    Benutzer191776

    22. Januar 2011 um 20:35 Uhr


Das sagt die C-Norm

Eine Definition eines Bezeichners ist eine Deklaration für diesen Bezeichner das: für ein Objekt bewirkt, dass Speicher für dieses Objekt reserviert wird (…)

Definitionen umfassen Deklarationen, dh jede Definition ist notwendigerweise eine Deklaration, also macht es keinen Sinn, das zu sagen

int i;

ist keine Deklaration. Es ist eine Deklaration, die zufällig auch eine Definition ist. Oder es ist eine Definition, also eine Deklaration.

  • Beachten Sie jedoch, dass nicht alle Deklarationen Definitionen sind.

    – Michael Burr

    22. Januar 2011 um 19:58 Uhr

Im Zusammenhang mit Variablen:

  • Eine Deklaration einer Variablen ist eine Anweisung, die beschreibt, wie diese Variable aussieht. So:

    extern int x;
    

    im globalen Geltungsbereich bedeutet: “Irgendwo im Code gibt es eine Variable namens x was Typ hat int und externe Verlinkung. Eine Erklärung ist notwendig, bevor Sie sich überhaupt darauf beziehen x. (Dasselbe gilt für Funktionsdeklarationen.)

  • Eine Definition ist eine Anweisung, die eine Instanz dieser Variablen erstellt. So:

    int x;
    

    im globalen Bereich erstellt eine einzelne Variable des Typs int mit externer Verlinkung. Wenn Sie also diese Zeile in eine Kopfzeile einfügen würden, würde jede Übersetzungseinheit, die diese Kopfzeile enthält, versuchen, eine eigene Kopie davon zu erstellen x, was unerwünscht ist – deshalb haben wir nur Deklarationen in Header-Dateien. Dasselbe gilt für Funktionen: Wenn Sie den Funktionskörper angeben, ist dies eine Definition.

Auch formal ist jede Definition eine Art Deklaration, da sie auch spezifizieren muss, wie diese Variable/Funktion aussieht – wenn also eine Definition in einem bestimmten Gültigkeitsbereich bereits existiert, brauchen Sie keine zusätzlichen Deklarationen, um sie zu verwenden.

Aus der C99-Spezifikation:

Eine Deklaration eines Bezeichners für ein Objekt mit Dateibereich ohne Initialisierer und ohne Speicherklassenbezeichner oder mit statischem Speicherklassenbezeichner stellt eine vorläufige Definition dar. Wenn eine Übersetzungseinheit eine oder mehrere vorläufige Definitionen für einen Bezeichner enthält und die Übersetzungseinheit keine externe Definition für diesen Bezeichner enthält, dann ist das Verhalten genau so, als ob die Übersetzungseinheit eine Dateibereichsdeklaration dieses Bezeichners enthält, mit dem zusammengesetzten Typ als des Endes der Übersetzungseinheit, mit einem Initialisierer gleich 0.

Dies ist also ein Fall, in dem eine einfache Deklaration ohne Initialisierer eine Deklaration sein kann.

Benutzer-Avatar
davep

Da C die Begriffe verwendet:

Eine “Definition” schafft etwas (was eine Art Gedächtnis belegt). Es beschreibt auch etwas. Eine „Definition“ ist also auch eine „Erklärung“.

Eine “Deklaration” beschreibt nur etwas. Die Idee ist, dass der Compiler wissen muss, wie er den Code erstellt, der das an anderer Stelle definierte Ding verwendet. Später verknüpft der Linker dann die Verwendung mit dem Etwas.

Deklarationen ermöglichen es Ihnen, Code zu kompilieren und (später) in einem separaten Schritt zu verknüpfen.

1323190cookie-checkDeklaration oder Definition in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy