※ ChatGPTを利用し、要約された質問です(原文:既に定義されている関数のプロトタイプがない警告)
既に定義されている関数のプロトタイプがない警告
このQ&Aのポイント
Cで作られたプログラムの単体テストを行う際に、プロトタイプ宣言のない関数 'writeFotter' の呼び出しの警告が出る問題について質問しています。
3つのファイルで構成されており、コンパイル時には1つのファイルにまとめられているため、プロトタイプ宣言がないという警告が生じる理由について疑問を持っています。
他の関数である 'writeHeader' や 'doCheck' は警告がないため、なぜ 'writeFotter' のみ警告が出るのか不明で、リンクも正常に動作しているが気持ち悪さを感じていると述べています。
現在、Cで作られたプログラムの単体テストをしています。
これを、以下のように、
・testBase.h → テストのための表示とかを作成するためのもの
・progForCheck.c → これがチェックすべきもので、この中の関数をそれぞれチェック
・add.c など → main() を含んだ、チェックを実行するためのファイル
として、以下のような感じで関数分のテストプログラムを作成してテストしようとしています。
テスト自体は問題ないのですが、この構成でコンパイルをすると、
警告 W8065 test.c 13: プロトタイプ宣言のない関数 'writeFotter' の呼び出し(関数 main )
警告 W8057 test.c 15: パラメータ 'argc' は一度も使用されない(関数 main )
という警告が出ます。後者はその通りで問題ないのですが、前者の警告は、よくわかりません。
実体は3つのファイルですが、コンパイル時にはひとつのファイルになって、既に定義されている
writeFotter() を呼んでいるだけなのに、「プロトタイプがない」という警告が出るのは、なぜなのでしょう。
それに、writeHeader() や、doCheck() は警告も無しです。
とりあえず、リンクも正常でちゃんと動作しているようなのですが、ちょっと気持ち悪いので質問しました。
// --------------- testBase.h ----------
#include <stdio.h>
int OK = 0;
int NG = 0;
void doCheck(int isOK)
{
if (isOK)
OK++;
else
NG++;
}
void writeHeader(char *title)
{
printf(" ------------ %s ------------\n", title);
}
void writeFotter()
{
printf(" OK = %d, NG = %d", OK, NG);
if (NG == 0)
printf(" ○○○○○○○○○○○○○○○○○○○\n");
else
printf(" ×××××××××××××××××××\n");
}
// ------------ progForCheck.c
int add(int a, int b)
{
return a + b;
}
int sub(int a, int b)
{
return a - b;
}
// ------------ test_add.c
#include "testBase.h"
#include "progForCheck.c"
int main(int argc, char *argv[])
{
writeHeader(argv[0]);
doCheck(add(1, 2) == 3);
doCheck(add(2, 4) == 6);
doCheck(add(8, 1) == 9);
writeFotter();
return 0;
}
お礼
そうでした。Cからしばらく離れていたので、void つけて、引数無しと明示しないとだめなのを忘れて悩んでいました。 ヘッダの使い方は……普通ではないです、確かに。