ヘッダファイルの役割

C言語プログラムの冒頭でincludeすることの多いstdio.hについて書きます。
stdio.hにはprintf関数のプロトタイプ宣言が書いてあるだけで、関数の本体は/usr/lib/libc.aの中にあります。
/usr/lib/libc.aの中に葉C標準ライブラリ関数のプログラムがバイナリコード形式で格納されています。
libc.aは-lmのオプションをつけなくてもコンパイルのときに自動的にリンクされます。
したがって、printfのプロトタイプ宣言を行ってあげれば、stdio.hファイルをインクルードする必要はないのです。
printfのプロトタイプ宣言の書き方を調べるには、UNIXオンラインマニュアルのSYNOPSISを調べます。

$ man 3 printf


SYNOPSIS
       #include <stdio.h>

       int printf(const char *format, ...);
       int fprintf(FILE *stream, const char *format, ...);
       int sprintf(char *str, const char *format, ...);
       int snprintf(char *str, size_t size, const char *format, ...);

よって以下のようにすればHelloworldをヘッダファイルのインクロードなしでコンパイルすることが加納です。

/* hello.c */

int printf(const char *, ...);
int main(void)
{
        printf("Hello, world!!\n");

        return 0;
}

$ gcc -o hello hello.c
$ ./hello
Hello, world