Die Bedeutung von beiden entgeht mir.
c
declaration
terminology
definition
c++-faq
Maciek
quelle
quelle
Antworten:
Eine Deklaration führt einen Bezeichner ein und beschreibt dessen Typ, sei es ein Typ, ein Objekt oder eine Funktion. Eine Deklaration ist das, was der Compiler benötigt , um Verweise auf diesen Bezeichner zu akzeptieren. Dies sind Erklärungen:
Eine Definition instanziiert / implementiert diesen Bezeichner tatsächlich. Es ist das, was der Linker benötigt , um Verweise auf diese Entitäten zu verknüpfen. Dies sind Definitionen, die den obigen Erklärungen entsprechen:
Eine Definition kann anstelle einer Erklärung verwendet werden.
Ein Bezeichner kann beliebig oft deklariert werden . Daher ist in C und C ++ Folgendes zulässig:
Es muss jedoch genau einmal definiert werden. Wenn Sie vergessen, etwas zu definieren, das irgendwo deklariert und referenziert wurde, weiß der Linker nicht, worauf er verweisen soll, und beschwert sich über fehlende Symbole. Wenn Sie etwas mehr als einmal definieren, weiß der Linker nicht, auf welche der Definitionen Verweise verweisen sollen, und beschwert sich über doppelte Symbole.
Da die Debatte , was eine Klasse Erklärung gegenüber einer Klassendefinition in C ++ kommen hält (in Antworten und Kommentaren zu anderen Fragen), werde ich ein Zitat aus dem C ++ Standard einfügen hier.
Bei 3.1 / 2 sagt C ++ 03:
3.1 / 3 gibt dann einige Beispiele. Unter ihnen:
Um es zusammenzufassen: Der C ++ - Standard betrachtet
struct x;
eine Deklaration undstruct x {};
eine Definition . (Mit anderen Worten, "Vorwärtsdeklaration" ist eine Fehlbezeichnung , da es in C ++ keine anderen Formen von Klassendeklarationen gibt.)Vielen Dank an litb (Johannes Schaub), der das eigentliche Kapitel und den Vers in einer seiner Antworten ausgegraben hat.
quelle
extern int i
ist eine Deklaration, da sie nur einführt / spezifizierti
. Sie können so vieleextern int i
in jeder Kompilierungseinheit haben, wie Sie möchten.int i
ist jedoch eine Definition. Es bezeichnet den Platz für die Ganzzahl in dieser Übersetzungseinheit und empfiehlt dem Linker, alle Verweise aufi
diese Entität zu verknüpfen . Wenn Sie mehr oder weniger als genau eine dieser Definitionen haben, wird sich der Linker beschweren.int i;
im Datei- / globalen Bereich oder Funktionsbereich ist eine Definition sowohl in C als auch in C ++. In C, weil es Speicher zuweist, und in C ++, weil es keinen externen Bezeichner oder keine Verknüpfungsspezifikation hat. Diese belaufen sich auf dasselbe, was sbi sagt: In beiden Fällen gibt diese Deklaration das Objekt an, mit dem alle Verweise auf "i" in diesem Bereich verknüpft werden müssen.struct A { double f(int, double); double f(int, double); };
natürlich ungültig. Es ist aber woanders erlaubt. Es gibt einige Stellen, an denen Sie Dinge deklarieren, aber auch nicht definieren können:void f() { void g(); }
gültig, aber nicht die folgenden :void f() { void g() { } };
. Was ist eine Definition und was für eine Deklaration gibt es subtile Regeln, wenn es um Vorlagen geht - Vorsicht! +1 für eine gute Antwort.Aus dem C ++ - Standardabschnitt 3.1:
Der nächste Absatz besagt (Hervorhebung von mir), dass eine Erklärung eine Definition ist, es sei denn ...
... deklariert eine Funktion ohne Angabe des Funktionskörpers:
... deklariert ein statisches Mitglied innerhalb einer Klassendefinition:
... es deklariert einen Klassennamen:
... enthält das
extern
Schlüsselwort ohne Initialisierer oder Funktionskörper:... oder ist eine
typedef
oderusing
Aussage.Aus dem großen Grund, warum es wichtig ist, den Unterschied zwischen einer Deklaration und einer Definition zu verstehen: die Ein-Definition-Regel . Aus Abschnitt 3.2.1 des C ++ - Standards:
quelle
struct x {static int b = 3; };
?b
auch deklariertconst
. Siehe stackoverflow.com/a/3536513/1858225 und daniweb.com/software-development/cpp/threads/140739/… .Erklärung: "Irgendwo gibt es ein Foo."
Definition: "... und hier ist es!"
quelle
Es gibt interessante Randfälle in C ++ (einige davon auch in C). Erwägen
Dies kann eine Definition oder eine Deklaration sein, je nachdem, um welchen Typ es sich
T
handelt:In C ++ gibt es bei Verwendung von Vorlagen einen anderen Randfall.
Die letzte Erklärung war keine Definition. Es ist die Erklärung einer expliziten Spezialisierung des statischen Mitglieds von
X<bool>
. Es sagt dem Compiler: "Wenn es um das Instanziieren geht, instanziierenX<bool>::member
Sie nicht die Definition des Elements aus der primären Vorlage, sondern verwenden Sie die Definition, die an anderer Stelle gefunden wurde." Um eine Definition zu erstellen, müssen Sie einen Initialisierer angebenquelle
Erklärung
Definition
quelle
class foo {};
ist eine Klasse Definition , ist es nicht?Aus dem C99-Standard 6,7 (5):
Eine Deklaration gibt die Interpretation und Attribute einer Reihe von Bezeichnern an. Eine Definition eines Bezeichners ist eine Deklaration für diesen Bezeichner, die:
Aus dem C ++ - Standard, 3.1 (2):
Eine Deklaration ist eine Definition, es sei denn, sie deklariert eine Funktion ohne Angabe des Funktionskörpers, enthält den externen Bezeichner oder eine Verknüpfungsspezifikation und weder einen Initialisierer noch einen Funktionskörper. Sie deklariert ein statisches Datenelement in einer Klassendeklaration Klassennamendeklaration oder eine typedef-Deklaration, eine using-Deklaration oder eine using-Direktive.
Dann gibt es einige Beispiele.
Interessanterweise (oder auch nicht, aber ich bin etwas überrascht)
typedef int myint;
ist eine Definition in C99, aber nur eine Deklaration in C ++.quelle
typedef
Würde das nicht bedeuten, dass es in C ++ wiederholt werden könnte, aber nicht in C99?Von wiki.answers.com:
Der Begriff Deklaration bedeutet (in C), dass Sie dem Compiler Typ, Größe und im Falle einer Funktionsdeklaration Typ und Größe seiner Parameter einer Variablen oder eines benutzerdefinierten Typs oder einer benutzerdefinierten Funktion in Ihrem Programm mitteilen. Im Falle einer Deklaration ist kein Speicherplatz für eine Variable reserviert. Der Compiler weiß jedoch, wie viel Speicherplatz reserviert werden muss, wenn eine Variable dieses Typs erstellt wird.
Im Folgenden sind beispielsweise alle Erklärungen aufgeführt:
Definition bedeutet andererseits, dass zusätzlich zu all den Dingen, die die Deklaration tut, auch Speicherplatz im Speicher reserviert ist. Sie können sagen "DEFINITION = DECLARATION + SPACE RESERVATION". Dies sind Beispiele für die Definition:
siehe Antworten .
quelle
struct foo {};
ist eine Definition , keine Erklärung. Eine Erklärung vonfoo
wärestruct foo;
. Aus diesem Grund weiß der Compiler nicht, wie viel Speicherplatz fürfoo
Objekte reserviert werden soll.struct foo;
ist eine Deklaration, die dem Compiler jedoch nicht die Größe von foo mitteilt. Ich würde hinzufügen, dass diesstruct _tagExample { int a; int b; };
eine Definition ist. In diesem Zusammenhang ist es irreführend, von einer Erklärung zu sprechen. Natürlich ist es eine, da alle Definitionen Deklarationen sind, aber Sie scheinen zu behaupten, dass es keine Definition ist. Es ist eine Definition von _tagExample.C ++ 11 Update
Da ich keine Antwort für C ++ 11 sehe, ist hier eine.
Eine Deklaration ist eine Definition, es sei denn, sie deklariert a / n:
enum X : int;
template<typename T> class MyArray;
int add(int x, int y);
using IntVector = std::vector<int>;
static_assert(sizeof(int) == 4, "Yikes!")
;
Zusätzliche Klauseln, die von der obigen Liste von C ++ 03 geerbt wurden:
int add(int x, int y);
extern int a;
oderextern "C" { ... };
class C { static int x; };
struct Point;
typedef int Int;
using std::cout;
using namespace NS;
Eine Template-Deklaration ist eine Deklaration. Eine Vorlagendeklaration ist auch eine Definition, wenn ihre Deklaration eine Funktion, eine Klasse oder ein statisches Datenelement definiert.
Beispiele aus dem Standard, der zwischen Deklaration und Definition unterscheidet, die ich zum Verständnis der Nuancen zwischen ihnen hilfreich fand:
quelle
Definition:
Die Definition ordnet die Variable einem Typ zu und weist Speicher zu, während die Deklaration nur den Typ angibt, aber keinen Speicher zuweist. Die Deklaration ist nützlicher, wenn Sie die Variable vor der Definition referenzieren möchten.
* Verwechseln Sie Definition nicht mit Initialisierung. Beide sind unterschiedlich, die Initialisierung gibt der Variablen einen Wert. Siehe das obige Beispiel.
Es folgen einige Beispiele für die Definition.
Jetzt Funktionsdeklaration:
Beachten Sie das Semikolon am Ende der Funktion, damit es nur eine Deklaration ist. Der Compiler weiß, dass diese Funktion irgendwo im Programm mit diesem Prototyp definiert wird . Wenn der Compiler nun eine Funktion erhält, rufen Sie so etwas auf
Der Compiler gibt einen Fehler aus, der besagt, dass es keine solche Funktion gibt. Weil es keinen Prototyp für diese Funktion gibt.
Beachten Sie den Unterschied zwischen zwei Programmen.
Programm 1
Dabei wird auch die Druckfunktion deklariert und definiert. Da kommt der Funktionsaufruf nach der Definition. Nun sehen Sie das nächste Programm.
Programm 2
Dies ist wichtig, da der Funktionsaufruf der Definition vorausgeht und der Compiler wissen muss, ob eine solche Funktion vorhanden ist. Also deklarieren wir die Funktion, die den Compiler informiert.
Definition:
Dieser Teil der Definition einer Funktion wird als Definition bezeichnet. Es sagt, was innerhalb der Funktion zu tun ist.
quelle
int a; //declaration; a=10; //definition
Das ist völlig falsch. Wenn es um Objekte mit automatischer Speicherdauer geht (Objekte, die innerhalb einer Funktionsdefinition deklariert wurden und nicht mit einem anderen Speicherklassenspezifizierer wie extern deklariert wurden), sind dies immer Definitionen.Definition bedeutet tatsächliche Funktion geschrieben & Deklaration bedeutet einfache Deklarationsfunktion für z
und
Dies ist die Definition der Funktionsfunktion
quelle
Faustregel:
Eine Deklaration teilt dem Compiler mit, wie die Daten der Variablen im Speicher zu interpretieren sind. Dies wird für jeden Zugriff benötigt.
Eine Definition reserviert den Speicher, um die Variable vorhanden zu machen. Dies muss genau einmal vor dem ersten Zugriff geschehen.
quelle
Um die Substantive zu verstehen, konzentrieren wir uns zuerst auf die Verben.
erklären - offiziell bekannt geben; proklamieren
definieren - um (jemanden oder etwas) klar und vollständig zu zeigen oder zu beschreiben
Wenn Sie also etwas deklarieren, sagen Sie einfach, was es ist .
Diese Zeile deklariert eine aufgerufene C-Funktion
sum
, die zwei Argumente vom Typint
akzeptiert und eine zurückgibtint
. Sie können es jedoch noch nicht verwenden.Wenn Sie angeben, wie es tatsächlich funktioniert , ist dies die Definition davon.
quelle
Um den Unterschied zwischen Deklaration und Definition zu verstehen, müssen wir den Assemblycode sehen:
und das ist nur Definition:
Wie Sie sehen können, ändert sich nichts.
Die Deklaration unterscheidet sich von der Definition, da sie Informationen enthält, die nur vom Compiler verwendet werden. Zum Beispiel weist uint8_t den Compiler an, die asm-Funktion movb zu verwenden.
Siehst du das:
Die Deklaration hat keine äquivalente Anweisung, da sie nicht ausgeführt werden muss.
Darüber hinaus teilt die Deklaration dem Compiler den Umfang der Variablen mit.
Wir können sagen, dass die Deklaration eine Information ist, die vom Compiler verwendet wird, um die korrekte Verwendung der Variablen festzustellen und wie lange ein Speicher zu einer bestimmten Variablen gehört.
quelle
Können Sie nicht allgemein sagen, dass eine Deklaration ein Bezeichner ist, in dem kein Speicher zugeordnet ist und eine Definition tatsächlich Speicher aus einem deklarierten Bezeichner zuweist?
Ein interessanter Gedanke: Eine Vorlage kann keinen Speicher zuweisen, bis die Klasse oder Funktion mit den Typinformationen verknüpft ist. Ist die Vorlagenkennung also eine Deklaration oder Definition? Es sollte eine Deklaration sein, da kein Speicher zugewiesen ist und Sie lediglich die Vorlagenklasse oder -funktion als Prototyp erstellen.
quelle
template<class T> struct foo;
ist eine Vorlage Erklärung , und so ist diestemplate<class T> void f();
. Vorlagendefinitionen spiegeln Klassen- / Funktionsdefinitionen auf dieselbe Weise wider. (Beachten Sie, dass ein Vorlagenname kein Typ- oder Funktionsname ist . An einer Stelle, an der Sie dies sehen können, können Sie eine Vorlage nicht als Typparameter einer anderen Vorlage übergeben. Wenn Sie Vorlagen anstelle von Typen übergeben möchten, benötigen Sie Vorlagenvorlagenparameter. )Finden Sie ähnliche Antworten hier: Technische Interview Fragen in C .
Eine Deklaration gibt dem Programm einen Namen. Eine Definition enthält eine eindeutige Beschreibung einer Entität (z. B. Typ, Instanz und Funktion) innerhalb des Programms. Erklärungen können in einem bestimmten Bereich wiederholt werden, es wird ein Name in einem bestimmten Bereich eingeführt.
Eine Erklärung ist eine Definition, es sei denn:
Eine Definition ist eine Erklärung, es sei denn:
quelle
Das wird wirklich kitschig klingen, aber es ist der beste Weg, die Begriffe in meinem Kopf klar zu halten:
Erklärung: Stellen Sie sich vor, wie Thomas Jefferson eine Rede hält ... "Ich erkläre hiermit, dass dieses FOO in diesem Quellencode existiert !!!"
Definition: Stellen Sie sich ein Wörterbuch vor, Sie suchen nach Foo und was es eigentlich bedeutet.
quelle
Eine Deklaration präsentiert dem Compiler einen Symbolnamen. Eine Definition ist eine Deklaration, die dem Symbol Platz zuweist.
quelle
Laut dem Handbuch der GNU C-Bibliothek ( http://www.gnu.org/software/libc/manual/html_node/Header-Files.html )
quelle
Das Konzept der Deklaration und Definition stellt eine Gefahr dar, wenn Sie die externe Speicherklasse verwenden, da sich Ihre Definition an einem anderen Speicherort befindet und Sie die Variable in Ihrer lokalen Codedatei (Seite) deklarieren. Ein Unterschied zwischen C und C ++ besteht darin, dass in C Sie die Deklarationen normalerweise am Anfang einer Funktion oder Codepage erfolgen. In C ++ ist das nicht so. Sie können an einem Ort Ihrer Wahl deklarieren.
quelle
Mein Lieblingsbeispiel ist "int Num = 5". Hier ist Ihre Variable 1. definiert als int 2. deklariert als Num und 3. instanziiert mit einem Wert von fünf. Wir
Mit einer Klasse oder Struktur können Sie ändern, wie Objekte definiert werden, wenn sie später verwendet werden. Zum Beispiel
Wenn wir das Programmieren lernen, werden diese beiden Begriffe oft verwechselt, weil wir oft beide gleichzeitig machen.
quelle
Stufen einer ausführbaren Generation:
In Stufe 2 (Übersetzer / Compiler) teilen Deklarationsanweisungen in unserem Code dem Compiler mit, dass diese Dinge wir in Zukunft verwenden werden, und Sie können die Definition später finden. Dies bedeutet:
und (3) Stufe (Linker) muss definiert werden, um die Dinge zu binden
quelle
Es gibt einige sehr klare Definitionen in K & R (2. Auflage); Es hilft, sie an einem Ort zu platzieren und als einen zu lesen:
quelle
Deklaration bedeutet, einer Variablen Namen und Typ zu geben (im Falle einer Variablendeklaration), z.
oder geben Sie einer Funktion ohne Body Namen, Rückgabetyp und Parametertyp (im Falle einer Funktionsdeklaration), z.
wohingegen Definition bedeutet, einer Variablen einen Wert zuzuweisen (im Fall einer Variablendefinition), z.
oder Bereitstellen / Hinzufügen eines Körpers (Funktionalität) zu einer Funktion wird als Funktionsdefinition bezeichnet, z.
Viele Zeitdeklarationen und Definitionen können zusammen durchgeführt werden als:
und:
In den obigen Fällen definieren und deklarieren wir die Variablen
i
undfunction max()
.quelle
int x;