プロが教える店舗&オフィスのセキュリティ対策術

次のようなコードで
(宣言等は省略します)


extern int
main( int argc, char *argv[])
{

short ret ;

ret = aaa();
}

static short
aaa()
{

/* aaa()関数の処理 */
XXXXXXXXX

return 1;


}

というようなコードをコンパイルすると
ワーニングで
warning: 'aaa' was declared implicitly `extern' and later `static'
warning: previous declaration of `aaa'
warning: type mismatch with previous implicit declaration

というようなメッセージが出ます。
これは、他のソースをまねて作ってるのですが、
参考にしたコードもこのような宣言の仕方になっているのにエラーはでまでん。
何か他にもaaaという関数の定義をしなくてはいけないのでしょうか?
どうもstatic宣言とexternのところがよくわかりません。
宜しくお願いします。

A 回答 (2件)

C言語は(基本的に)前置宣言を必要とします。


つまり、ret = aaa(); の前にaaa()の宣言が必要です。

C言語では前置宣言の無い関数はextern intと仮定されます。
結果、aaa()はextern int aaa()と仮定されています。
しかし、後で static short aaa()という行が存在する為不整合が起こっています。

・externである関数がstaticとして宣言されている
・int型の関数がshot型として宣言されている

以上2点に対する警告です。

static,externは記憶クラスに関する宣言です。
記憶クラスとスコープについての理解を深めましょう。
    • good
    • 1

コンパイラは上から順に解釈していきますので、


main関数の中でaaa関数を呼んだ時に未定義の関数だよと言われているだけです。
main関数の上にプロトタイプ宣言でaaa関数を定義するか、
もしくはaaa関数とmain関数の位置を入れ替えてください。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!