関数を含めずstdio.h
に使用してもprintf
gccに警告が表示される理由を誰かに教えてもらえますか?
警告:組み込み関数'printf'の互換性のない暗黙の宣言</p>
宣言されていない関数が含まれているため、これはコンパイルエラーになるはずです。
これはリンク手順と関係がありますか?詳しく説明してください。
コードで使用する関数のシグネチャを指定しない場合、コンパイラは (暗黙的に) 不明な関数が引数リストとして受け入れるものについていくつかの仮定を行い、結果として返します。
これらの仮定は、関数の使用法に基づいているため、たとえば が与えられた場合、コンパイラは、可変引数リストではなく正確に 2 を取る関数であるprintf("%s", (char *) string)
と判断し、を返します。printf
char *
int
これらの仮定が実際の関数と互換性がないことが判明した場合、リンク中に問題が発生する可能性があります。
pb2qの答えは正しいです。この回答は、表示された特定の警告メッセージに関する追加の説明を提供します。
GCCは、の組み込み関数を定義しますprintf
。組み込み関数には適切なプロトタイプがあります。
int printf(const char *, ...);
ただし、暗黙の宣言は固定数の引数を想定しています。したがって、プログラムが次のようになっていると仮定します。
int main () {
printf("%s\n", "Hello, World!");
return 0; // not required in C 2011
}
その場合、の暗黙の宣言は次のprintf
ようになります。
int printf(char *, char *);
これは組み込み関数のタイプと一致しないため、警告の文言です。そのメッセージの直前に、そもそもプロトタイプがないことを訴える警告メッセージが表示された可能性があります。
warning: implicit declaration of function 'printf'
おそらく、コンパイラとデフォルトのライブラリに関係しています。printf が既に使用されている標準ライブラリ (おそらくデバッグ バージョン) に対してリンクしている場合、printf はグローバル名前空間にあり、リンクされます。コンパイラは、printf を明示的に宣言していないことを警告しています。-Werror をオンにして、すべての警告エラーを作成すると、コンパイラはリンカー ステージに到達させません。