2010-08-15 3 views
5

Ich versuche, die gleiche Variable zwischen zwei .cpp-Dateien zu teilen, enthalten sie die gleiche .h-Datei.Probleme mit globalen Variablen zwischen Quelldateien geteilt (Ich verwende Include-Wachen)

Aber ich bekomme Verknüpfungsfehler, sag mir, dass ich mehrere Definitionen habe. Welche finde ich peinlich, da ich Wachen bin mit umfassen

//main.cpp 
#include <cstdio> 
#include "shared.h" 

int main(){ 
    shared_int = 5; 
    printVal(); 
    return 0; 
} 


//shared.h 
#ifndef INCLUDE_GUARD_H 
#define INCLUDE_GUARD_H 
#include <cstdio> 
#include <cstdlib> 
int shared_int; 
int printVal(); 
#endif 

//shared.cpp 
#include <cstdio> 
#include "shared.h" 


int printVal(){ 
    fprintf(stderr,"a: %d\n",shared_int); 
    return 0; 
} 

I wie

g++ shared.cpp -c;g++ main.cpp shared.o 
shared.o:(.bss+0x0): multiple definition of `shared_int' 
/tmp/cci8w8Am.o:(.bss+0x0): first defined here 
collect2: ld returned 1 exit status 

dank comping bin

Update: Die 'extern' immer noch nicht funktioniert, aber jetzt bin erhalten einen nicht definierten Referenz Dies sind die aktualisierten Dateien

//shared.h 
#ifndef INCLUDE_GUARD_H 
#define INCLUDE_GUARD_H 
#include <cstdio> 
#include <cstdlib> 
//extern "C" int shared_int;//i've tried both 
extern int shared_int; 
int printVal(); 
#endif 

//shared.cpp 
#include <cstdio> 
#include "shared.h" 

int printVal(){ 
    fprintf(stderr,"a: %d\n",shared_int); 
    return 0; 
} 

//main.cpp 
#include <cstdio> 
#include "shared.h" 

int main(){ 
    int shared_int = 5; 
    printVal(); 
    return 0; 
} 

Dies ist, wie ich

g++ main.cpp shared.o 
shared.o: In function `printVal()': 
shared.cpp:(.text+0x6): undefined reference to `shared_int' 
collect2: ld returned 1 exit status 
+1

Die Antwort bereits von Greg gegeben ist, aber sicher sein, den Unterschied zwischen einer Erklärung und einer Definition zu verstehen. Es ist ein wichtiger Unterschied, der Ihnen hilft, die Nachrichten des Compilers besser zu verstehen und die Gesamtsemantik des Codes zu verstehen. – Nick

+0

Ihr aktualisierter Code fügt "extern" C "hinzu (was etwas ganz anderes ist als das, was ich in meiner Antwort vorgeschlagen habe) und führt überhaupt keine Definition ein. Versuchen Sie stattdessen, was ich in meiner Antwort vorgeschlagen habe. –

+0

@greg Hewgill. Ich habe das auch versucht, den gleichen Linkfehler.Danke – monkeyking

Antwort

15

Die Deklaration in Ihrer Header-Datei benötigt ein extern kompilieren:

extern int shared_int; 

Dann müssen Sie eine tatsächliche Instanz der Definition in einen C++ Datei (wie in shared.cpp):

int shared_int; 

Die Wachen sind hier Sie verwenden sind gute Praxis, aber sie wird in dieser Situation keine Wirkung haben. Der Include-Guard verhindert, dass die Header-Datei mehr als einmal in die selbe Quelldatei aufgenommen wird. Eine solche Situation tritt normalerweise nicht auf, es sei denn, Sie haben Header-Dateien, die indirekt aus anderen Header-Dateien stammen.

+0

+1 Greg. Ich habe auch bemerkt, dass @monkeyking C-Header-Dateien .h mit C++ - Compiler mischt. Das ist keine sehr gute Übung, deshalb möchte ich darauf hinweisen, dass es wahrscheinlich besser ist, wenn Sie das Symbol zwingen, als C-Symbol exportiert zu werden, um Probleme mit dem Namenmangel zu vermeiden. Definieren Sie einfach die Variable in shared.h wie folgt: extern "C" int shared_int; – karlphillip

+3

@ karlphillip: Es gibt keine "C-Header-Datei" - Header-Dateien sind mit jedem Compiler kompiliert # enthält sie. Der '.h' Name ist für C++ völlig akzeptabel. Manche Leute benutzen '.hpp' oder' .hxx', aber das ist nur Stil und hat überhaupt keine Bedeutung. –

0

Erstens, Globals sind keine gute Idee und man muss so weit wie möglich vermeiden. Unter der Annahme, dass es in Ihrer speziellen Situation aus irgendwelchen Gründen zwingend erforderlich ist, würde ich aus einer reinen OO-Perspektive folgendermaßen vorgehen:

a) Definieren Sie die globale Variable in einer Datei sagen a.cpp (auch wenn die Variable kann in einem Namensraum eingebettet werden)

b) schreiben get/set-Funktionen in a.cpp

c) Zugriff auf die globale Variable in a.cpp die get/set-Funktionen.

Auf diese Weise hätten Sie einen sehr modularen Aufbau mit wohldefinierter Schnittstelle.

-1

sind Sie sehr bald:

//shared.h 
#ifndef INCLUDE_GUARD_H 
#define INCLUDE_GUARD_H 
#include <cstdio> 
#include <cstdlib> 
//extern "C" int shared_int;//i've tried both 
extern int shared_int; 
int printVal(); 
#endif 

//shared.cpp 
#include <cstdio> 
#include "shared.h" 

int printVal(){ 
    fprintf(stderr,"a: %d\n",shared_int); 
    return 0; 
} 

//main.cpp 
#include <cstdio> 
#include "shared.h" 

int shared_int = 0; // definition (extern ... is declaration) 
        // initialize force definition 

int main(){ 
    shared_int = 5; 
    printVal(); 
    return 0; 

}

Verwandte Themen