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
メイク '' text' const' 1つの定義ルールを破っています – David
http://stackoverflow.com/questions/7926224/header-include-guards-dont-work – Unimportant
ちょうどuser1320881のcommeを拡張していますnt:ここで起こっているのは、main.cppをコンパイルすると、Header.hが正確に1回だけ取り込まれます。 dosomething.cppをコンパイルすると、Header.hは正確に1回だけ取り込まれます。両方とも 'text'の定義があり、リンカーが文句を言うのです。あなたのヘッダーガードは仕事をしていますが、この問題を防ぐことは自分の仕事ではありません。 –