アプリ版:「スタンプのみでお礼する」機能のリリースについて

main.c:7:43: warning: implicit declaration of function ‘dcal’ [-Wimplicit-function-declaration]
fprintf(stdout,"dcal(%g,%g)=
%g\n",a,b,dcal(a,b));
^~~~
main.c:7:34: warning: format ‘%g’ expects argument of type ‘double’, but
argument 5 has type ‘int’ [-Wformat=]
fprintf(stdout,"dcal(%g,%g)=
%g\n",a,b,dcal(a,b));
~^ ~~~~~~~~~
%d
main.c:10:5: warning: implicit declaration of function ‘g_print’; did you mean ‘dprintf’? [-Wimplicit-function-declaration]
g_print();
^~~~~~~
dprintf

--------------------------------------------------------------------
func.c:6:5: warning: implicit declaration of function ‘fprintf’ [-Wimplicit-function-declaration]
fprintf(stdout,"func:gval=%d\n",gval);
^~~~~~~
func.c:6:5: warning: incompatible implicit declaration of built-in function ‘fprintf’
func.c:6:5: note: include ‘<stdio.h>’ or provide a declaration of ‘fprintf’
func.c:6:13: error: ‘stdout’ undeclared (first use in this function)
fprintf(stdout,"func:gval=%d\n",gval);
^~~~~~
func.c:6:13: note: each undeclared identifier is reported only once for each function it appears in
func.c:6:37: error: ‘gval’ undeclared (first use in this function); did you mean ‘dcal’?
fprintf(stdout,"func:gval=%d\n",gval);
^~~~
dcal

上記のような警告やエラーが出たのですがどのような意味か教えてください。

A 回答 (1件)

全文、google翻訳にかけてみてください。


わりとまともな日本語になります。

○C言語では、「使う前に宣言」が大原則ですが、大昔のC言語ではそうではありませんでした。
その名残りで
・宣言されていない関数は 「引数任意、戻り値intの関数」として宣言されたと見做す
・宣言されていない変数は 「int型の変数」として宣言されたと見做す
という「暗黙の宣言(implicit declaration)」というルールがあります。

ただし、昨今の作り方としては非推奨だし、変数の方は(最近の規格では)暗黙の宣言はできずにエラーとなります。


warning: implicit declaration of function 〜 は「関数の暗黙の宣言をしている」という「警告」です。
正確にはエラーではありませんので、コンパイル自体は進みます。

error: ‘???’ undeclared というのは「???という変数が未定義」というエラーです。

○ printf や fprintf , scanf 等の一部の関数( 宣言が func(...) みたいになっているもの) は、本来、引数の型をチェックできません。
%〜 の数や対応する型を正しく指定するのは、プログラマの自己責任となります。
ですが、一部のコンパイラは、できる範囲でチェックして、対応が間違っているときに「警告」を出します。

> main.c:7:34: warning: format ‘%g’ expects argument of type ‘double’, but
> argument 5 has type ‘int’ [-Wformat=]

%g は 対応するdouble型の値を出力する書式です。
これに該当する箇所には、 dcal(a,b) があります。
この dcal が「暗黙の宣言」によって, int型の戻り値の関数となっています。
そのため、求められる(expects)型である double と、指定された int とで違います、という警告が出ています。


○ did you mean 〜
未定義の名前にたいして「もしかしたらこれの打ち間違いですか?」という提案をしているものです。
ですが、いずれも的はずれの指摘をしているようです。




https://oshiete.goo.ne.jp/qa/11400399.html
こちらでは、(func.hの使い方がよくないですが) ちゃんと事前の宣言がされていてエラーなくコンパイルできます。
変更の方法がよくなかったのではないでしょうか
    • good
    • 0
この回答へのお礼

ありがとうございます!
これを参考にして進めてみます!!

お礼日時:2019/12/10 23:33

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

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A