4

関数を含めstdio.hに使用してもprintfgccに警告が表示される理由を誰かに教えてもらえますか?

警告:組み込み関数'printf'の互換性のない暗黙の宣言</p>

宣言されていない関数が含まれているため、これはコンパイルエラーになるはずです。

これはリンク手順と関係がありますか?詳しく説明してください。

4

3 に答える 3

8

コードで使用する関数のシグネチャを指定しない場合、コンパイラは (暗黙的に) 不明な関数が引数リストとして受け入れるものについていくつかの仮定を行い、結果として返します。

これらの仮定は、関数の使用法に基づいているため、たとえば が与えられた場合、コンパイラは、可変引数リストではなく正確に 2 を取る関数であるprintf("%s", (char *) string)と判断し、を返します。printfchar *int

これらの仮定が実際の関数と互換性がないことが判明した場合、リンク中に問題が発生する可能性があります。

于 2012-08-13T18:18:01.567 に答える
6

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'
于 2012-08-13T18:46:19.570 に答える
0

おそらく、コンパイラとデフォルトのライブラリに関係しています。printf が既に使用されている標準ライブラリ (おそらくデバッグ バージョン) に対してリンクしている場合、printf はグローバル名前空間にあり、リンクされます。コンパイラは、printf を明示的に宣言していないことを警告しています。-Werror をオンにして、すべての警告エラーを作成すると、コンパイラはリンカー ステージに到達させません。

于 2012-08-13T18:22:12.903 に答える