2016-03-28 4 views
0

C++の(実際には基本的でシンプルな)問題のため、約半時間インターネットを検索しています。たぶん私は何かを逃しているかもしれませんが、私は何がわかりません。私は3つのファイルを持っていると言う: "main.cpp"、 "dosomething.cpp"と "Header.h"。C++のコンパイラは、ヘッダに複数回定義された値を見つけます。

"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;  
} 

と "dosomething.cpp"

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

} 

今のコンパイラ/リンカは、と言われます"text"はすでに別のファイルで定義されています。どうして?私は#pragma onceや#ifndefなどのようなガードイディオムがどのように動作するか知っています。私はここで何が間違っているのか分かりません。コード自体は動作します( "dosomething.cpp"のヘッダを含まない場合)。

編集:イムは2015

+1

メイク '' text' const' 1つの定義ルールを破っています – David

+5

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

+2

ちょうどuser1320881のcommeを拡張していますnt:ここで起こっているのは、main.cppをコンパイルすると、Header.hが正確に1回だけ取り込まれます。 dosomething.cppをコンパイルすると、Header.hは正確に1回だけ取り込まれます。両方とも 'text'の定義があり、リンカーが文句を言うのです。あなたのヘッダーガードは仕事をしていますが、この問題を防ぐことは自分の仕事ではありません。 –

答えて

0

は、あなたがにexternキーワードを配置する必要がありますVisual Studioを使用。 C/C++ではすべての.c/.cppファイルがファイルのテキストを結合し、すべての定義がリンクステップでマージされます。ヘッダー変数の前に 'extern'を書くと、それをただ一つのC++ファイルで定義することができ、他のすべてのファイルはそれを再利用します。リンカーは、あなたがそれを出した変数のインスタンスを1つだけ使用します。

だから、このheader.hで

#pragma once 
extern char text[]; 

main.cppには、同じままですが、 "dosomething.cpp" の変更少し

#include "Header.h" 

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

(...) 

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

関連する問題