
次のようなコードで
(宣言等は省略します)
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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のファイル入力が分かりません 2 2022/05/22 06:35
- C言語・C++・C# C言語 共用体について コマンドライン引数で値を2つ入力したときに、argv[2]の値をUNI u1 4 2022/04/25 20:34
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- 工学 Pythonの3次元描画に関する質問です 3 2022/12/07 20:07
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
C++のfor文について
-
main.c:7:43: warning: implici...
-
intとINTの違いは?
-
VC6でlong longでエラー?
-
構造体の要素すべてに対する四...
-
long型の定数の末尾にLを付ける...
-
マージソートのプログラム
-
STLのsortで、プライベート変数...
-
TCP/IPでのgetsockname()の使い...
-
【#define】 defineで定義した...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++でboolにintの値を代入する...
-
識別子が定義されていませんと...
-
int main の前のint add(int a,...
-
sshdログの意味
-
64bit → 32bit型へのキャスト
-
構造体の宣言でエラーが出ます。
-
unsigned *という宣言について
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
visualstudio C# テキストボッ...
-
typedef enumの使い方を教えて...
-
2重定義って??
-
C++のfor文について
-
C++でboolにintの値を代入する...
-
main.c:7:43: warning: implici...
-
【#define】 defineで定義した...
-
構造体の要素すべてに対する四...
-
void func( void )について
-
enumについて
-
プログラムの中で別のmainを呼...
-
intとINTの違いは?
-
エラー「invalid conversion fr...
-
ハンドルされていない例外が発...
-
変数の型を定義しなかった場合...
-
関数の実体定義にヘッダファイ...
-
構造体の宣言でエラーが出ます。
-
C言語のコンパイルエラー
おすすめ情報