2016-03-28 16 views
0

Ich suche im Internet für eine halbe Stunde wegen eines (eigentlich einfachen und einfachen) Problems in C++. Vielleicht verpasse ich etwas, aber ich weiß nicht was. Sagen wir, ich habe 3 Dateien: "main.cpp", "dosomething.cpp" und "Header.h".C++ Compiler findet Werte im Header mehrmals definiert

"header.h":

#pragma once 
#ifndef HEADER_H 
#define HEADER_H 
char text[] = "This is a text"; 
#endif // !HEADER_H 

"main.cpp"

#include <stdio.h> 
#include <iostream> 
#include "Header.h" 

using namespace std; 

void main() { 
    cout << text << endl;  
} 

und "dosomething.cpp"

#include "Header.h" 
void dosth() { 

} 

Jetzt ist der Compiler/Linker sagt mir, dass "Text" ist bereits in einer anderen Datei definiert. Warum? Ich weiß, wie Wächter-Idiome wie #pragma und #ifndef funktionieren - zumindest denke ich. Ich habe keine Ahnung, was hier falsch ist. Der Code selbst funktioniert (wenn die Überschrift in "dosomething.cpp" nicht enthalten ist).

Irgendeine Idee?

Edit: Im mit Visual Studio 2015

+1

make '' Text' const', Sie brechen die eine Definitionsregel – David

+5

http://stackoverflow.com/questions/7926224/header-include-guards-dont-work – Unimportant

+2

Nur auf user1320881's Comme zu erweitern nt: Was hier passiert, ist folgendes: Wenn Sie main.cpp kompilieren, wird Header.h genau einmal eingeschlossen; Wenn Sie dosomething.cpp kompilieren, wird Header.h genau einmal eingeschlossen. und jetzt haben beide Definitionen von "Text" in und der Linker beschwert sich. Ihre Kopfwächter machen ihre Arbeit, aber dieses Problem zu verhindern, ist nicht ihre Aufgabe. –

Antwort

0

Sie müssen extern Keyword setzen. C/C++ für jede .c/.cpp Datei kombiniert den Text von Dateien und alle Definitionen werden im Verknüpfungsschritt zusammengeführt. Wenn Sie 'extern' vor die Header-Variable schreiben, können Sie sie in nur einer C++ - Datei definieren, und alle anderen Dateien werden sie wiederverwenden. Der Linker verwendet nur eine Instanz der Variablen, zu der Sie ihn geöffnet haben.

So in header.h

#pragma once 
extern char text[]; 

main.cpp bleibt gleich, aber "dosomething.cpp" Änderungen leicht

#include "Header.h" 

(...) 
char text[] = "..."; 

(...) 

https://en.wikipedia.org/wiki/External_variable