2016-08-03 3 views
1

プロトタイプを正しい方法で定義する方法が疑わしい状況に遭遇しました。プロトタイプを定義する正しい方法

ドキュメントのAc:

#define foo bar 

void mon() { 
    foo(); 
} 

ドキュメントBcの:

void bar() { 
    Do something; 
} 

は、次の警告を与える:

警告:機能は持っていませんが簡単にはちょうど簡単な例を見てIt's完全なプロトタイプ

通常、私はそれを解決するでしょう:例として示すように、関数は正確には存在しませんが、別の関数を指すように定義されています。このためのプロトタイプを作る正しい方法は何ですか?

+0

別の関数を指すことは定義されていません。トークン置換を指定するプリプロセッサディレクティブです。関数はまったく宣言されていません。 – StoryTeller

+1

'#define foo bar'あなたは何をしようとしていますか? –

+0

@ Lightness軌道のレース、ねえ、私は何もしようとしていない。この警告はUmonのブートローダから来ているので、私は考え方を "修正"しようとしている。 – Pedersen

答えて

0

コンパイラは同じソースファイルの#define foo bar後に宣言extern void foo(void);に遭遇した場合、それはextern void bar(void);としてそれを解析すると、リンカはちょうどbarシンボルを解決します。

barの定義が上記の宣言と一貫していないことに注意してください。 barの定義は次のようになります。Cで

void bar(void) { 
    // Do something; 
} 

を、C++とは異なり、(void)の引数リストは、空の引数リストとは微妙に異なっています。

+0

ねえ、ありがとう!それは実際に意味をなさない。正しい方法は私がいつも持っているようにすることです – Pedersen

0

私は何が起こるかは、次のされていることを、考える:

コンパイラはbarでマクロfooを置き換えますが、その段階でbarがどこかの関数として宣言されていないため、コンパイラは、それはそれを見つけることができない、文句を言うでしょう。

詳細を参照してください:Are prototypes required for all functions in C89, C90 or C99?

関連する問題