ライブラリを使用するためにヘッダー ファイルが本当に必要ですか?コードはヘッダー ファイルなしで機能し、ライブラリは完全にリンクされていますが、「警告: 関数の暗黙の宣言」メッセージが表示されます。
4 に答える
ヘッダー ファイル:- は、プログラマーがプログラムのソース コードの特定の要素を再利用可能なファイルに分離できるようにするファイルです。
ライブラリ ファイルは、ヘッダー ファイルで指定された内容に従って機能する実行可能コードです。
「警告: 関数の暗黙の宣言」メッセージが表示されます。
ヘッダー ガードが正しく機能していないなど、この警告には多くの理由が考えられます。もう 1 つの可能性は、関数を宣言したFunc
が、 で呼び出していることfunc
です。
これをチェックしてください:-
ヘッダー ファイルをインクルードすることは、ヘッダー ファイルの内容をコピーすることと同じですが、ヘッダー ファイルの内容をソース ファイルにコピーすることはお勧めできません。プログラムを構成する複数のソースファイルがあります。
ライブラリを使用するためにヘッダー ファイルが本当に必要ですか?
はい。
私のコードはヘッダー ファイルなしで動作します
いいえ、そうではありません。機能しているように見えるだけです。
「警告:関数の暗黙の宣言」メッセージが表示されることを除いて、ライブラリは完全にリンクされています
この場合、私はそれを「完璧」とは呼びません。
それでも、私のプログラムが実行されるという単なる警告です。
そして、未定義の動作を呼び出すため、それが何をするのかを知ることはできません. 「ただの警告」?もちろん。コンパイラが警告するのには理由があります。警告を尊重して修正します。
これは、C99 (6.5.2.2.6) からの引用です。これは、プログラムがヘッダーなしで UB を持っている理由を説明しています (より正確には、どちらも持っていないように見える適切な関数プロトタイプなしで):
- 呼び出された関数を示す式の型がプロトタイプを含まない場合、各引数に対して整数昇格が実行され、float 型の引数は double に昇格されます。これらは、デフォルト引数プロモーションと呼ばれます。引数の数がパラメーターの数と等しくない場合、動作は未定義です。
関数がプロトタイプを含む型で定義されており、プロトタイプが省略記号 (, ...) で終わっているか、昇格後の引数の型がパラメーターの型と互換性がない場合、動作は未定義です。
関数がプロトタイプを含まない型で定義されており、昇格後の引数の型が昇格後のパラメーターの型と互換性がない場合、次の場合を除き、動作は未定義です。
— 一方の昇格型は符号付き整数型で、もう一方の昇格型は対応する符号なし整数型であり、値は両方の型で表現可能です。
— どちらのタイプも、文字タイプまたは void の修飾または非修飾バージョンへのポインターです。
ヘッダー ファイルが使用されるのには十分な理由があります。言語を発明して設計した人々は、自分たちが何をしているのかを知っていました。彼らがこの決定を下したのは、それが必要なことであり、コンパイル単位全体で型を可視にする必要があるという問題に対する優れた解決策だからです。
ほとんどのスターターにとって、この警告は、使用を開始したときに表示されます
malloc
だから私はこの例を使用しています。この場合の警告については、次を追加する必要があります。
#include <stdlib.h>
このファイルには、組み込み関数の宣言が含まれていますmalloc
。そうしないと、コンパイラは、名前付きの独自の関数を定義したいと考え、次のmalloc
理由で警告を表示します。
- あなたはそれを明示的に宣言せず、
- 暗黙的に宣言されたものとは異なる署名を持つその名前の組み込み関数が既に存在します (関数が暗黙的に宣言されている場合、その戻り値と引数の型は であると想定され
int
、組み込み関数と互換性がありません)。 inmalloc
、これは a を取り、 asize_t
を返しますvoid*
)。