//#include <stdio.h>
//#include <conio.h>
main(){
printf("Hi");
getch();
}
これをプログラミングしていたとき、printf 関数を含む stdio などの c ライブラリを実際にインポートしなくても機能することにショックを受けました。どうしてこんなことに?(Dev-C++ 4.9.9.2 を使用、.cpp ではなく .c として保存)
//#include <stdio.h>
//#include <conio.h>
main(){
printf("Hi");
getch();
}
これをプログラミングしていたとき、printf 関数を含む stdio などの c ライブラリを実際にインポートしなくても機能することにショックを受けました。どうしてこんなことに?(Dev-C++ 4.9.9.2 を使用、.cpp ではなく .c として保存)
C では、最初にプロトタイプを定義しなくても関数を呼び出すことができます。(C++ はこれを行いません。) の暗黙のプロトタイプはprintf
次のように定義されます。
int printf();
偶然にも、この暗黙のプロトタイプの呼び出し規則はprintf
、プラットフォームの実際の呼び出し規則と一致していました。
一般に、これが機能するとは考えられず、機能しない場合が多数あります。コンパイラの警告を有効にして暗黙のプロトタイプ宣言を検出し、修正できるようにすることをお勧めします (正しいヘッダーを含めることにより)。
脚注: #include
ライブラリをインポートしません。コンパイル時にソース コードにファイルを貼り付けるだけです。<stdio.h>
ヘッダーには (直接的または間接的に) 特定のプロトタイプが含まれていますが、ライブラリは個別にリンクする必要があります。は通常、デフォルトでプログラムにリンクされているライブラリにあるためprintf
、通常、 を使用するために何もする必要はありませんprintf
。
#include
プリプロセッサ ディレクティブはライブラリをインポートしません。C言語の定義には、そのようなインポートの概念はありません。
という名前の関数を呼び出すprintf
と、標準のCライブラリ (たとえばlibc.so
、Linux では、Windows での呼び出し方法がわからない) がデフォルトでたまたまリンクされます。そのライブラリに知られている名前で関数を呼び出すため、リンクされ、実行時に呼び出されます。
ただし、コンパイラですべての警告を有効にする必要があります。これにより、宣言されていない関数を呼び出すことが警告されます。