インクルードファイルの意味を考える
先ずは、Hello worldプログラムに、#include<stdio.h>が絶対必要なのかと考え調べた結果、必ずしも必要ではありませんでした。
次のプログラムでも実行出来ます。
int printf( const char * _Format, ...); int main() { return printf( "Hello world!\n" ); }
わずか二行です。コンソール画面に「Hello world」と表示するぐらいならば、#includeは必要ありません。このプログラムはprintf関数の定義が必要なだけなので、printf関数を定義すればコンパイルできます。
※コンパイラはこの宣言文を使って、引数をチェックします。その為に、関数の引数の定義が必要となります。
では、#includeとは何をするものなのでしょうか?それを知るには、#includeの意味をおさらいする必要があります。
名著「S・P・ハービソン3世とG・L・スティール・ジュニアのCリファレンスマニュアル
プリプロセッサ適用後の内容を見る方法は、コンパイラにより異なりますが、大概のコンパイラはコンパイルオプションを指定すれば、見る事が出来ます。例えば、VC++ならばPオプションを使用します。そして、GCCならば-save-tempsオプションを指定し、中間ファイルの保存を指示する事により、拡張子iのインクルードファイルを見る事が出来ます。
このファイルを見ると、#includeが何をしているのか分かると思います。#includeプリプロセッサ指令文は、コンパイラがプログラムをチェックするために、関数の定義を展開しています。
なお、#include<stdio.h>は必ずしも、stdio.hファイルを指しているとは限らない事に注意して下さい。C言語の規格では、#include<>が本当のファイル名を指している事を要請していません。処理系によっては違うかもしれません。