5

重複の可能性: printf() を使用するために
#include <stdio.h> が必要ないのはなぜですか?

//#include <stdio.h>
//#include <conio.h>

main(){

printf("Hi");
getch();

}

これをプログラミングしていたとき、printf 関数を含む stdio などの c ライブラリを実際にインポートしなくても機能することにショックを受けました。どうしてこんなことに?(Dev-C++ 4.9.9.2 を使用、.cpp ではなく .c として保存)

4

2 に答える 2

7

C では、最初にプロトタイプを定義しなくても関数を呼び出すことができます。(C++ はこれを行いません。) の暗黙のプロトタイプはprintf次のように定義されます。

int printf();

偶然にも、この暗黙のプロトタイプの呼び出し規則はprintf、プラットフォームの実際の呼び出し規則と一致していました。

一般に、これが機能するとは考えられず、機能しない場合が多数あります。コンパイラの警告を有効にして暗黙のプロトタイプ宣言を検出し、修正できるようにすることをお勧めします (正しいヘッダーを含めることにより)。

脚注: #includeライブラリをインポートしません。コンパイル時にソース コードにファイルを貼り付けるだけです。<stdio.h>ヘッダーには (直接的または間接的に) 特定のプロトタイプが含まれていますが、ライブラリは個別にリンクする必要があります。は通常、デフォルトでプログラムにリンクされているライブラリにあるためprintf、通常、 を使用するために何もする必要はありませんprintf

于 2012-06-22T06:03:55.300 に答える
4

#includeプリプロセッサ ディレクティブはライブラリをインポートしません。C言語の定義には、そのようなインポートの概念はありません。

という名前の関数を呼び出すprintfと、標準のCライブラリ (たとえばlibc.so、Linux では、Windows での呼び出し方法がわからない) がデフォルトでたまたまリンクされます。そのライブラリに知られている名前で関数を呼び出すため、リンクされ、実行時に呼び出されます。

ただし、コンパイラですべての警告を有効にする必要があります。これにより、宣言されていない関数を呼び出すことが警告されます。

于 2012-06-22T06:04:38.943 に答える