
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
上記のような警告やエラーが出たのですがどのような意味か教えてください。
No.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の使い方がよくないですが) ちゃんと事前の宣言がされていてエラーなくコンパイルできます。
変更の方法がよくなかったのではないでしょうか
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
C言語のポインターに関する警告
C言語・C++・C#
-
C言語でヘッダファイルにグローバル変数を宣言する
C言語・C++・C#
-
gcc: incompatible pointer type
C言語・C++・C#
-
-
4
【gcc・cygwin】multiple definitionエラーの解決法
C言語・C++・C#
-
5
C言語初心者の質問失礼します。
C言語・C++・C#
-
6
C言語のコンパイルエラー
C言語・C++・C#
-
7
ポインター引数の関数でコンパイルエラーが出る。
C言語・C++・C#
-
8
エラーの意味は? Lvalue required
C言語・C++・C#
-
9
C言語のポインタに直接アドレスを割り振りしたい
C言語・C++・C#
-
10
PCC-S-02201エラーの対処を教えてください!
Oracle
-
11
コンパイルエラーについて
C言語・C++・C#
-
12
C言語 配列の長さの上限
C言語・C++・C#
-
13
makeコマンドのエラーについて(
UNIX・Linux
-
14
C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して
C言語・C++・C#
-
15
変数の値が勝手に変化する原因
C言語・C++・C#
-
16
【C言語】構造体内の領域解放(free)の仕方
C言語・C++・C#
-
17
declaration of 'index' shadow a global declaration
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
main.c:7:43: warning: implici...
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
C++でboolにintの値を代入する...
-
構造体の宣言でエラーが出ます。
-
C++のfor文について
-
enumについて
-
エラー「invalid conversion fr...
-
GCCで暗黙の型変換の警告を出し...
-
C++/CLIでネイティブの構造体を...
-
typedef enumの使い方を教えて...
-
【#define】 defineで定義した...
-
void func( void )について
-
C言語のコンパイルエラー
-
inline
-
VC6でlong longでエラー?
-
C言語 宣言した変数になにも代...
-
変数の型を定義しなかった場合...
-
DLLのLPSTR 項目の戻り値の取得...
マンスリーランキングこのカテゴリの人気マンスリー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について
おすすめ情報