Frage

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 globalen variablen Verknüpfungsunterschied zwischen C & C ++?

War es hilfreich?

Lösung

Es ist nicht streng legal.int a; ist eine vorläufige Definition in C. Sie dürfen mehrere vorläufige Definitionen und höchstens eine nicht vorläufige Definition pro Übersetzungseinheit jedes Objekts mit externer Verknüpfung in C, jedoch nur eine Definition über alle Übersetzungseinheiten in einem Programm hinweg.

Es handelt sich um eine häufig implementierte Erweiterung, die vorläufige Definitionen über mehrere Übersetzungseinheiten in C hinweg zulässt, sofern nicht mehr als eine Übersetzungseinheit eine nicht vorläufige Definition enthält, diese jedoch nicht streng standardisiert ist.

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

Für den Fall C können Sie sich diese Frage .

Andere Tipps

In beiden Fällen ist dies illegal, aber C-Compiler implementieren im Allgemeinen eine Erweiterung.Siehe diese Antwort .

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

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

  2. Sie können das Schlüsselwort static verwenden, um den Gültigkeitsbereich der Variablen auf eine Datei zu beschränken.In dem es deklariert ist.

  3. Oder Sie verwenden einen namenlosen Namespace.

Der g ++ - Compiler ist strenger als der gcc-Compiler. Es hängt auch von der Version von gcc ab, kann eine höhere Version von gcc sein, d. H. Ab 4.X kann es den gleichen Fehler geben.

Verwenden Sie extern, um zu vermeiden

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top