2017-03-09 8 views
0

私はヘッダファイルと2つのソースファイルを持っています。このヘッダファイルには、次の宣言があります。配列宣言でヘッダを含むときのエラー

const char *letters[] = {"A", "B", "C", "D"}; 

私は両方のソースファイルに自分のヘッダファイルを含めました。私がコンパイルしようとする私が取得:

/tmp/cc6gLw9s.o:(.data+0xa0): multiple definition of `letters' 
/tmp/ccjqd0rr.o:(.data+0xa0): first defined here 
+4

同じ変数が複数回定義されていますが、それは配列ですが変数です。変数**定義**をヘッダーに入れてはいけません。 – StoryTeller

+3

これは、技術的に*コンパイラ*エラーではなく、リンカ*エラーであり、複数の[*翻訳単位*](* https://en.wikipedia.org/wiki/Translation_unit_%28programming)で変数を定義する*ことを意味します%29)(基本的に全てのヘッダを含むソースファイル)。ヘッダーファイルに*変数*を定義しない*。 –

答えて

5

あなたは別に2のソースファイルをコンパイルし、それらのそれぞれはヘッダが含まれている場合、その変数lettersは、一度、各ソース・ファイルで、2回宣言されます。これを防ぐには、変数をヘッダファイルにexternと宣言します。

extern const char *letters[]; 

はその後、ソースファイルで実際の変数を置きます。

const char *letters[] = {...}; 
+0

グローバル変数、特に外部リンクを持つグローバル変数に問題がある理由について1つまたは2つの文を追加できますか?この答えについて私に迷惑をかけるのは唯一のことです。 – StoryTeller

+0

私はそれについて何を言うべきか分かりません。私は彼らが醜いと思っていますが、私は主に統一ビルドを使用しているので、私は過去に特別なトラブルがあった経験は本当にありませんでした。 – bace1000

+0

カプセル化のための良い設計についてはそれほど多くはありません。また、マルチスレッドプログラムでは悪夢となります。しかし、大丈夫、NVM。 – StoryTeller

1

ファイルをほぼ完全にコピー&ペーストしています。ヘッダーが同じコンパイルに2回含まれていると、そのコードが2回書き込まれたようになります。

これは通常、ヘッダーが2回コンパイルされないようにプリプロセッサを使用することで回避されます。

#ifndef _MYHEADERS_H_ 
#define _MYHEADERS_H_ 

const char *letters[] = {"A", "B", "C", "D"}; 

#endif 

これは、他の回答で提起された問題に加えてあります。 #pragma onceは、標準Cではない

#pragma once 

const char *letters[] = {"A", "B", "C", "D"}; 

注こと、それはsupported on most compilersです:

関連する問題