#include <stdio.h>の謎 | とらのブログ

とらのブログ

ジャグリングが趣味のプログラマー(?)が綴る適当な日記

あまり本に載っていないので書いてみます。検索すると書いている方はいるようです。
カゴテリ作ったものの他にネタがないという。
ええ、見切り発車です。

今回は

しゃーぷ、いんくるーど、すたでぃお、てん、えいち

という、おまじないのお話。

C言語というより、C言語系ですね。もっというと言語そのものではなかったと思います。

プログラムを習うと、必ずと言って良いほどハローワールドの出力から始まります。
そして必ずと言って良いほど#include~はとりあえず書いておいてね扱いされます。

そしてステップを進んでいっても説明がされません。

考えても仕方がないので、考えるのをやめます。


こんな状況を打破しましょう。分解して説明します。


■#(シャープ)

C、言、語…?となる原因。

プリプロセス命令、プリプロセッサ命令と呼ばれるものの指定に用います。

#~行末までがプリプロセス命令の範囲です。

複数行にまたがる場合は、行末に\を記述します。


プリプロセッサとは、コンパイルの前に動作するプログラムのことを指します。

ヘッダを読み込んだり、条件付きコンパイルをしたり。


#includeのほかにも#define、#if、#ifdef等の命令があります。

とてもお世話になっています。


■include

ヘッダファイルを読み込むプリプロセス命令です。


ヘッダファイルには関数の宣言や構造体の定義がされており、

.ファイルを読み込んだCファイルは自ファイル内で定義していなくとも

その関数や構造体を利用することができます。

逆にいえば、読み込んでいないと関数、構造体は自ファイルに定義されていない限り

利用できないことになります。


■<stdio.h>

<>の中に読み込みたいヘッダファイルを指定します。

自分でヘッダファイルを作成する段階になればわかりますが、

#include "hedder.h"

と書くこともあります。


何が違うのかというと、ファイルを探す順番です。

<>は環境変数INCLUDEとして定義されている、ディレクトリを優先して検索します。

   ここに標準て用意されている関数のヘッダ等が置いてあるはずです。

""はコンパイル対象となるCファイルの置いてあるディレクトリを優先して検索します。


stdio.hは標準の入出力関数ライブラリで、printf等が定義されています。

ちなみに、standard input/output の略です。スタジオは一切関係ありません。

プラットフォームが提供している機能なので、ないときはない。


検索をかけたところ、下記に存在していました(Visual Studioインストールしてて良かった)。

C:\Program Files\Microsoft Visual Studio 8\VC\include


最後に、よく使うプリプロセス命令を書いておきます。

#include

#define

#ifdef, #ifndef

#typedef

(#if, #elseif, #endif)


まあまあ使うけれどよくわかっていないのが、#pragma。

コンパイラによって処理が違うらしいです。

そもそも使用せず無視するものもあるそうで。

毎回何だこれ?って思ってしまいます。


プリプロセス命令は使い方を覚えておくと非常に便利です。

私自身は知っている方ではないので、説得力に欠けてしまいますが。


本文以上。


分かりやすく書くのは難しいですね。

上手い文章を書ける方々を尊敬します。

ここわかりにくい、間違っている、等ありましたらコメントを頂けると幸いです。