2017-11-04 1 views
0

Ich möchte auf eine Variable in mehreren Dateien zugreifen. Ich habe verschiedene Ressourcen untersucht. Ich konnte es jedoch nicht lösen. Ich verwende cmake, um alle Codes in diesem Projekt zu erstellen. Es folgt ein Beispiel, das genau zu meinem Problem passt. Grundsätzlich möchte ich val 42 in beiden code1.cpp und code2.cpp drucken. Wenn ich diese drei Dateien erstelle, klagt es: undefined reference to 'he::val' collect2: error:ld returned 1 exit status für beide .cpp-Dateien.Wie Zugriff auf eine Variable in mumtiple cpp-Dateien enthalten Hauptabschnitt in jeder Datei?

header1.h

#ifndef HEADER1_H 
#define HEADER1_H 
#include <iostream> 
namespace he { 
extern int val; 
} 
#endif // HEADER1_H 

code1.cpp

#include "header1.h" 
#include <iostream> 
using namespace he; 

int func() 
{ 
std::cout << val << std::endl; 
} 

int main() 
{ 
val=20; 
func(); 
return 0; 
} 

code2.cpp

#include <iostream> 
#include "header1.h" 
using namespace he; 

int main() 
{ 
std::cout << val << std::endl; 
} 

Antwort

0
extern int val; 

Ist eine Variablendeklaration. Sie müssen irgendwo (in einem Ihrer CPP-Dateien), um die Variable zu definieren:

int val; 

Eigentlich, da man zwei main() Funktionen haben, diese sind zwei separate Programme. Dann ist Ihre Variablendefinition muss in beide sein, wie folgt aus:

namespace he { 
    int val; 
} 

Aber Ihre extern-Deklaration in der Header-Datei macht die Variable global, die in der Regel verpönt. Es kommt natürlich darauf an, was dein Ziel ist.

Da zwei main() Funktionen zwei getrennte Programme bedeuten, gibt es auch keine gemeinsame Variablen.

+0

Dann, wie kann ich Variable teilen? Gibt es einen anderen alternativen Weg? –

+0

Um eine Variable zwischen zwei cpp-Dateien zu teilen, definieren Sie sie in einer und deklarieren sie als extern in der anderen (am häufigsten über eine Header-Datei). Best Practice besteht jedoch darin, Daten in Modulen zu kapseln und den Zugriff über Funktionen oder Methoden zu ermöglichen, nicht durch direkten Zugriff auf Variablen. – nilo

+0

Hallo, ich habe viel gesucht und 'boost :: shared_memory_object' gefunden, um nützlich zu sein. Aber dann, wenn ich versuche, ein einfaches Programm in https://theboostcpplibraries.com/boost.interprocess-managed-shared-memory (Beispiel 33.6) zu bauen, bekomme ich folgenden Fehler. 'In der Funktion boost :: interprocess :: shared_memory_object :: priv_open_or_create (boost :: interprocess :: ipcdetail :: create_enum_t, char const *, boost :: interprocess :: mode_t, boost :: interprocess :: berechtigungen const &) ':' It zeigt auch undefinierte Verweise auf 'shm_open',' shm_unlink'. –

Verwandte Themen