2016-10-15 7 views
2

(NB:純粋なC/Arduino)。C前方宣言

私はたくさんのリンクを見つけましたが、誰も私に答えませんでした。

ファイル「Effects.h」と「Keyboard.h」があります。

Keyboard.hには「Effects.h」を含めるとが必要です。

extern fnKeyPress effectDrops(); 
extern fnKeyPress effectLineRotate(); 
extern fnKeyPress effectRainbowCycle(); 

彼らはすべてこれら2つのパラメータを取る関数へのポインタを返す必要があります:const KeyWithColor *, const struct KeyConfiguration *だから、「Effects.hは、」私は、これらの3つの機能を作った「Effects.h」で「Keyboard.h

を含めることはできません

だから私はこれをやろうとしている:

typedef void (*fnKeyPress)(const KeyWithColor *, const struct KeyConfiguration *); 
extern fnKeyPress effectDrops(); 
extern fnKeyPress effectLineRotate(); 
extern fnKeyPress effectRainbowCycle(); 

しかし、ある動作しません、それは言うので、 s:

Effects.h:32: error: 'KeyWithColor' does not name a type 
typedef void (*fnKeyPress)(const KeyWithColor *, const struct KeyConfiguration *); 

回避策を教えてください。

+2

型も宣言する必要があります。 –

+0

@JoachimPileborg "アイデア"ありがとうございますが、もっと具体的なものが必要です...私はあなたに答えて私に例を挙げてもらえますか?ありがとうございました –

+0

適切なインクルードガードを追加すると、任意のファイルに任意の順序で他のヘッダーファイルを含めることができます。 –

答えて

2

あなたはKeyWithColorと(多分)KeyConfiguration宣言転送する必要がある場合:

(あなたKeyWithColor型が構造体である場合、私は知らない、私はそれが簡単にするためであると仮定します)

その後、場所をこの:この上

struct KeyWithColor; 
struct KeyConfiguration; 

typedef void (*fnKeyPress)(const KeyWithColor *, const struct KeyConfiguration *); 
extern fnKeyPress effectDrops(); 
extern fnKeyPress effectLineRotate(); 
extern fnKeyPress effectRainbowCycle(); 

ドゥこれは、コメントで指摘されているように型を前方宣言していることになります。そして、基本的にコンパイラに伝える:

をあなたはまだこのことを知らないが、私は

は前方宣言で、実装のいずれかの種類を入れないように気をつけて定義されることを保証します。

+0

ありがとう –