2011-01-12 6 views
1

はCで、次のtypedef構造体を考えてみましょう: Cのtypedef構造体の不確実性

21:typedef struct source{ 
22: double ds;    //ray step 
23: double rx,zx;   //source coords 
24: double rbox1, rbox2; //the box that limits the range of the rays 
25: double freqx;   //source frequency 
26: int64_t nThetas;  //number of launching angles 
27: double theta1, thetaN; //first and last launching angle 
28:}source_t; 

が、私はエラーを取得する:
globals.h:21:28:ERROR: '構造体の源'
globals.hの再定義:28::注:エラー:「source_t」
globals.hための相反するタイプ

:「source_t」の前の宣言は、ここで私は、この定義のために他のフォーマットを使用してみました

ました


struct source{ 
... 
}; 
typedef struct source source_t; 

との両方が同じエラーを返す


typedef struct{ 
... 
}source_t; 

。 なぜこれが起こりますか?それは私に完全に正しいように見える。

+3

"globals.h"ファイルがソースファイルから2回インクルードされるように見える – SirDarius

+0

は私にとって完璧に機能します:http://ideone.com/kKj8q – eckes

+0

SirDariusのコメントに基づいて:あなたは** reinclude保護を設定してください** globals.hで**? – eckes

答えて

6

これを避けるには、#ifndef/#pragma onceを使用しないで、ヘッダーを2回追加してもよろしいですか? あなたの構成に間違いがあったとしても、エラー「「...の再定義」を引き起こすべきではありません。なぜなら、これは最初の行ですか?

+0

ええ、globals.hを含む[ファイルを含む(数回繰り返す)]ファイルが含まれていました。使用された '#pragma once'とそれは不思議でした。執筆者にガードが含まれていることを忘れないでください。ありがとう! –

+2

両方を使用してください - '#pragma'sはコンパイラ固有です。 –

3

原因としては、ヘッダーファイルが複数回含まれている可能性があります。 この場合、typedefは一度だけ実行されるようにする必要があります。

あなたはとglobals.hラップすることによってこれを行うことができます。

#ifndef _globals_h_ 
    #define _globals_h_ 
    [...] 
    #endif 
+1

インクルードシンボル名にアンダースコアを付けて開始しないでください。このような名前は、標準ライブラリの実装で使用するために予約されています。 (いくつかの例外がありますが、火をつけないほうが良いです。)プリプロセッサに供給されるものはすべて大文字で使用するのが普通ですので、 'GLOBALS_H'は問題ありません。 –

+0

@Karl:フィードバックをいただきありがとうございます。 –

3

エラーがstruct sourceが複数回定義されていると言います。

ヘッダーファイルを2回インクルードしたことがありますか?

ちょうどあなたのヘッダは一度しか含まれますことを確認することが、安全のために:あなたのヘッダファイルの末尾に先頭に

#ifndef YOUR_HEADER_FILE_NAME 
#define YOUR_HEADER_FILE_NAME 

を入れて、

#endif 

:これにより、任意のソースファイルによって2回以上含まれなくなります。

関連する問題