はじめに
最近宇宙開発系の企業に興味を持っていて、その会社に行くためにはC言語の理解が必要不可欠なのではないかと感じたので、ここ最近C言語を触っています。
JavaScript
やRuby
で標準出力をする時下記のように書くことできますよね。
console.log("hello world");
超絶簡単に出力することができます。しかしながら、C言語では以下のように書かなければなりません。
#include <stdio.h>
int main() {
printf("hello world\n");
return 0;
}
なんとまぁ長いなとおもいました。その中で#include <stdio.h>
はなんだ、という疑問が湧いたので今回はそれを調べてアウトプットしようと思います。
対象者
読んでいただきたい対象者は以下の方になるかと思います。
-
include <stdio.h>
がおまじないだと思っている方 - 自分と同じくC言語初心者の方
- 強強エンジニアの方(間違えていたらご指摘お願いします)
#include <stdio.h>
はなんだ?
IBMのドキュメントをみたところ、
stdio.hというヘッダー・ファイルは、標準入出力を処理する関数を宣言します。
と書いてあります。ここでさらに疑問が出てくるのが「ヘッダーファイルって何?」っていうことですね。ヘッダーファイルを調べていきます。
ヘッダーファイルとは?
GNUのドキュメントによると、以下のように記述されています。
ヘッダーファイルは、C宣言とマクロ定義(マクロを参照)を含むファイル
と書かれています。つまり、マクロ定義や特定の変数、関数、型を含んでいるファイルのことをヘッダーファイルというんですね。
#include <stdio.h>
さきほど記述した通り、ヘッダー・ファイルは、マクロ定義や特定の変数、関数、型を含んでいるファイルのこと
と述べました。つまり、#include <stdio.h>
とは標準入出力を処理するマクロ定義や特定の変数、関数、型を含んでいるファイルのことなんですね。
実際に、stdio.h
のなかにprintf
関数のソースコードを見てみます。
int _EXFUN(printf, (const char *, ...));
このファイルをincludeすることでこの関数を使うことができるんですね。
まとめ
これまで#include <stdio.h>
はおまじないだと思っていましたが、実際は、stdio.h
を読み込んで、その中にあるprintf
関数を使用していたんですね。
そして、stdio.h
などのヘッダーファイルはマクロ定義や特定の変数、関数、型を含んでいるファイルのことを指すんですね。
おまけ
ここまでの記事を書いている中で、includeせずにprintf関数を使ってみると、奇妙な現象に陥りました。
int main() {
printf("hello world\n");
return 0;
}
上記のコードを実行すると、
hoge.c:2:5: error: call to undeclared library function 'printf' with type 'int (const char *, ...)'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
printf("hello world\n");
^
hoge.c:2:5: note: include the header <stdio.h> or explicitly provide a declaration for 'printf'
1 error generated.
hello world
という警告が発生するのですが、hello world
は出力されるんですね。ヘッダーファイルをincludeしていないのになぜ出力されたのか謎です。有識者の方がいたら教えてください!