dポイントプレゼントキャンペーン実施中!

分割コンパイルした場合のプロトタイプ宣言について質問です。
以下のプログラムをコンパイルすると警告がでます。
プロトタイプ宣言は関数を利用する側と定義側両方に必要と理解していたのですが・・・
どなたか教えていただけますでしょうか。

windows7 cygwin gccでコンパイル
エラーメッセージ
$ gcc -o testMain.exe testMain.c testKioku.c
testKioku.c:9: 警告: conflicting types for 'func1'
testKioku.c:3: 警告: previous declaration of 'func1' was here
testKioku.c:17: 警告: conflicting types for 'func2'
testKioku.c:4: 警告: previous declaration of 'func2' was here

ソース
testMain.c
#include <stdio.h>

void func1(void);
void func2(void);
int cnt=5;

main(){

printf("main=%d\n",cnt);
func1();
func2();
}

testKioku.c
#include <stdio.h>

void func1(void);
void func2(void);

extern int cnt;

func1()
{
cnt++;
printf("func1 global cnt=%d\n",cnt);
func2();
}

func2()
{
printf("func2 global cnt=%d\n",cnt);
}

A 回答 (2件)

メッセージを読みましたか?内容を理解しましたか?



testKioku.c:9: 警告: conflicting types for 'func1'
コンフリクト(衝突)
コンピュータ用語としては、二つ以上のものが矛盾したりする状態を示します。

この警告は9行目で出ています。

testKioku.c:3: 警告: previous declaration of 'func1' was here
その「衝突相手」である「previous declaration」(以前の宣言)は3行目だ、と言っています。

言われた通りに、この二つを比較します、
9行目は
func1()
とだけあります。
C言語で、このように宣言すると
int func()
 引数: 任意(可変長)
 戻り値: int
だと判断されます。

3行目の宣言では
void func1(void);
 引数: 無し(void)
 戻り値: 無し(void)
ですから、「違う」と判断されます。


この func() だけ、という書き方は、あまり推奨できるものではありません。
main関数も、この省略形が使われていますが、古いやり方です。

関数定義部分も、プロトタイプ宣言と同じく、型や引数を書くようにしましょう。
    • good
    • 0
この回答へのお礼

大変参考になりました。
ありがとうございました。

お礼日時:2014/06/01 23:01

func1()とfunc2()のプロトタイプ宣言をtestMain.cとtestKioku.cのそれぞれで行っているのもおすすめしません。


プロトタイプ宣言ではないですけどtestKioku.cのextern int cnt;もかな。
    • good
    • 0

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