28 Stimmen

c & c++ standardmäßige globale variablenverknüpfung, problem der mehrfachen deklaration und definition

Zum Beispiel:

code1.c / .cpp

int a;

// ... and so on

code2.c / .cpp

int a;

int main(void) {
    return 0;
}

zum Kompilieren gehen:

$gcc code1.c code2.c      # this is fine
$

$g++ code1.cpp code2.cpp  # this is dead
/tmp/ccLY66HQ.o:(.bss+0x0): multiple definition of `a'
/tmp/ccnIOmPC.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status

Gibt es einen Unterschied zwischen der Verknüpfung globaler Variablen in C und C++?

21voto

CB Bailey Punkte 693084

Das ist nicht ganz legal. int a; ist eine tentative Definition in C. Es sind mehrere tentative Definitionen und höchstens eine nicht-tentative Definition pro Übersetzungseinheit jedes Objekts mit externer Verknüpfung in C erlaubt, aber nur eine Definition für alle Übersetzungseinheiten in einem Programm.

Es ist eine häufig implementierte Erweiterung, um tentative Definitionen über mehrere Übersetzungseinheiten in C zuzulassen, solange nicht mehr als eine Übersetzungseinheit eine nicht-tentative Definition enthält, aber es ist nicht unbedingt Standard.

In C++ int a; ist nur eine Definition - es gibt kein Konzept von tentativ - und es ist immer noch illegal, mehrere Definitionen eines Objekts in den Übersetzungseinheiten eines Programms zu haben.

Für den Fall C sollten Sie sich Folgendes ansehen diese Frage .

4voto

Artefacto Punkte 93200

Es ist in beiden illegal, aber C-Compiler implementieren im Allgemeinen eine Erweiterung. Siehe diese Antwort .

2voto

George Gaál Punkte 1196

Es gibt drei Möglichkeiten zur Lösung des Problems:

  1. Wenn die Variable a in beiden Dateien identisch ist, müssen Sie es als extern in allen Dateien außer einer. extern Schlüsselwort sagt dem Linker, dass sich dieser Name in einer anderen Datei befindet.

  2. Sie können verwenden static Schlüsselwort, um den Geltungsbereich der Variablen auf eine Datei zu beschränken. in der sie deklariert ist.

  3. Oder Sie können einen namenlosen Namensraum verwenden.

1voto

Stuti Punkte 1610

Der g++-Compiler ist strenger als der gcc-Compiler. Es hängt auch von der Version von gcc ab. Höhere Versionen von gcc, z.B. ab 4.X, können denselben Fehler verursachen.

使用方法 extern zu vermeiden

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X