web-dev-qa-db-ja.com

GCCコンパイラエラー:「再定義...以前に定義されました」

「以前にここで定義したx .... xの再定義」がたくさんあります。このエラーはどういう意味ですか?

13
caesar

各ファイルが1回だけ含まれるように制限する必要があります。これは2つの方法で行うことができます。

1)ヘッダーファイルの先頭に次のように配置します。

#pragma once

または2)コンパイラがそれをサポートしていない場合は、ヘッダーファイルの先頭/末尾に配置します。

#ifndef _MYFILE_H_
#define _MYFILE_H_
...
#endif

MYFILEをファイルの名前に置き換え、...をヘッダーファイルの内容に置き換えます。

33
Brian R. Bondy

このエラーは、ある場所で定義されたシンボルがあり、別の場所で別の定義が行われたことを意味します。

これは、次のような場合に発生する可能性があります。

  • 同じ名前で2つの関数を定義する場合
  • 関数とそのプロトタイプの間に不一致がある場合
  • 定義される前に、プロトタイプなしで重要な関数を呼び出す

この最後のケースでは、実際の関数と、使用するプロトタイプがない場合にコンパイラーが想定する「暗黙の宣言」との間に不一致があります。

これらの状況は、次の方法で回避できます。

  • 関数プロトタイプが1回だけ宣言されるようにする
  • すべての関数がスコープ内で一意の名前を持っていることを確認します(つまり、staticの場合はファイル内で、オブジェクトファイル間で使用されている場合は一意の名前)
  • ソースファイルでexternステートメントを使用してプロトタイプを宣言する場合は、注意が必要です。適切なヘッダーファイルのプロトタイプを使用することをお勧めします。
  • すべての関数にプロトタイプがあることを確認します-static関数の場合はソースファイル内に、他のオブジェクトファイルで使用される場合はヘッダーファイル内に。
  • MehrdadとBrianR。Bondyによって提案された構成のいずれかを使用して、すべてのヘッダーファイルをソースファイルごとに1回だけインクルードできるようにします。
12

おそらくヘッダーファイルを2回インクルードしています。ヘッダーファイルが#ifndefステートメントで囲まれていることを確認してください。

http://www.fredosaurus.com/notes-cpp/preprocessor/ifdef.html

7
Mehrdad Afshari

同じことが私にも起こりました。それは、ヘッダーファイルの代わりに.c/.cppファイル(その中に)を誤ってインクルードしたためです。

それは間違いなくあなたにそのエラーの多くを得るでしょう。

0
MasterMastic