
次のようなコードで
(宣言等は省略します)
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のところがよくわかりません。
宜しくお願いします。
No.2ベストアンサー
- 回答日時:
C言語は(基本的に)前置宣言を必要とします。
つまり、ret = aaa(); の前にaaa()の宣言が必要です。
C言語では前置宣言の無い関数はextern intと仮定されます。
結果、aaa()はextern int aaa()と仮定されています。
しかし、後で static short aaa()という行が存在する為不整合が起こっています。
・externである関数がstaticとして宣言されている
・int型の関数がshot型として宣言されている
以上2点に対する警告です。
static,externは記憶クラスに関する宣言です。
記憶クラスとスコープについての理解を深めましょう。
No.1
- 回答日時:
コンパイラは上から順に解釈していきますので、
main関数の中でaaa関数を呼んだ時に未定義の関数だよと言われているだけです。
main関数の上にプロトタイプ宣言でaaa関数を定義するか、
もしくはaaa関数とmain関数の位置を入れ替えてください。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
プログラムの中で別のmainを呼...
-
構造体の宣言でエラーが出ます。
-
long型の定数の末尾にLを付ける...
-
GCCで暗黙の型変換の警告を出し...
-
C++のfor文について
-
2重定義って??
-
C++でboolにintの値を代入する...
-
sshdログの意味
-
スレッドのスケジューリングポ...
-
構造体の要素すべてに対する四...
-
C++ クラスをメンバにもつクラ...
-
関数の実体定義にヘッダファイ...
-
テンプレート関数でコンパイル...
-
【#define】 defineで定義した...
-
void func( void )について
-
Aの値からBの値を除するとは??
-
「Aに対するBの割合」と「Aに対...
-
複数桁10進数の*桁目だけを抽出...
-
有効数字について 以前質問をし...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
main.c:7:43: warning: implici...
-
intとINTの違いは?
-
C++のfor文について
-
2重定義って??
-
void func( void )について
-
変数の型を定義しなかった場合...
-
C言語のコンパイルエラー
-
C++でboolにintの値を代入する...
-
ハンドルされていない例外が発...
-
構造体の要素すべてに対する四...
-
構造体の宣言でエラーが出ます。
-
プログラムの中で別のmainを呼...
-
[C++]メンバ関数の仮引数について
-
0除算を判定したい
-
プログラム、どのように書いて...
-
typedef enumの使い方を教えて...
-
enumについて
おすすめ情報