C言語入門|標準ライブラリと自作ライブラリの基本

ライブラリを使うという発想

これまでの学習で、printf や scanf、strlen、memcpy など、
たくさんの便利な関数を当たり前のように使ってきました。

でも、ここで一度立ち止まって考えてみましょう。

これらの関数は、いったい誰が作ったのでしょうか?

答えはシンプルで、C言語が標準として用意してくれているライブラリです。
そして実は、私たち自身も同じ仕組みで「自作ライブラリ」を作り、使い回すことができます。

この節では、

  • 標準ライブラリとは何か
  • 自作ライブラリはどのように公開・利用するのか

という2つの視点から、ライブラリの基本を整理していきます。

標準ライブラリとは何か

C言語は、世界中で使われているプログラミング言語です。
そのため、「環境が変わると動かない」という状況をできるだけ避ける必要があります。

もし、

  • printf の書式が処理系ごとに違う。
  • strlen の動作が環境によって異なる。

といったことが起きたら、プログラムを書く人は大混乱してしまいます。

そこで、C言語では ISO によって言語仕様と標準ライブラリが定義 されています。
この規格に従っていれば、

  • GCC
  • Clang
  • Visual C++

といった異なる処理系でも、基本的に同じ関数が同じ意味で使えるのです。

標準ライブラリはヘッダファイルとして提供される

標準ライブラリに含まれる関数やマクロは、ヘッダファイルとして定義されています。

代表的なヘッダファイルを表にまとめると、次のようになります。

表:標準ライブラリの代表的なヘッダファイル

ヘッダファイル主な役割
stdio.h入出力(printf, scanf, FILE など)
stdlib.hメモリ管理、数値変換、終了処理
string.h文字列操作、メモリ操作
math.h数学関数
time.h時刻・時間操作
ctype.h文字判定
errno.hエラー情報
assert.hデバッグ用検査

ヘッダファイルの数は30個以上あり、
関数の数は数百にのぼります。

とはいえ、日常的に使うものは限られており、
すでに見覚えのある関数も多いはずです。

標準ライブラリはなぜ自動でリンクされるのか

printf などを使うとき、
私たちは特別なリンク指定をしていません。

これは、標準ライブラリの実体(libc など)が
処理系によって自動的にリンクされる仕組みになっているからです。

つまり、

  • ヘッダファイルで宣言を読み込み。
  • 実体は裏側でリンクされている。

という形で、
標準ライブラリは「意識せずに使える」存在になっています。

自作ライブラリという考え方

ここまで読んで、

便利な関数をまとめて再利用できたらいいのに

と思った人もいるかもしれません。

実はそれこそが、自作ライブラリです。

C言語では、誰でも次の2つを用意すればライブラリを公開できます。

要素内容
ヘッダファイル関数や変数のプロトタイプ宣言
オブジェクトファイルコンパイル済みの処理本体

このセットを使えば、他のプログラムから同じ関数群を再利用できます。

自作ライブラリ公開の基本構成

自作ライブラリは、次のような構成になります。

  • mylib.h
    外部に公開する関数の宣言を書く
  • mylib.o または mylib.a
    コンパイル済みの関数本体

使う側は、

  • ヘッダファイルをインクルード
  • ビルド時にオブジェクトやライブラリをリンク

するだけで、機能を利用できます。

これは標準ライブラリとまったく同じ考え方です。

ライブラリを公開する楽しさ

自作ライブラリを公開すると、

  • 自分のコードが誰かの役に立つ。
  • 繰り返し使える資産になる。
  • 開発効率が大きく向上する。

といったメリットがあります。

規模の小さなプログラムでも、
「よく使う処理をまとめる」だけで立派なライブラリです。

CPUとOSによる制約に注意

ここで1つ重要な注意点があります。

ライブラリの実体であるオブジェクトファイルは、
マシン語で記述されています。

そのため、

  • CPU の種類
  • OS の違い

によっては、互換性がありません。

たとえば、

  • Windows 用に作った .lib
  • Linux 用に作った .a

は、そのままでは使えない場合があります。

複数の環境に対応したい場合は、
それぞれの環境向けにライブラリを用意する必要があります。

まとめ:ライブラリは分割開発の完成形

最後に、ポイントを整理します。

  • 標準ライブラリは ISO によって定義された共通資産
  • ヘッダファイルは「使い方の説明書」
  • ライブラリの実体はコンパイル済みの処理本体
  • 自作ライブラリは誰でも作れる。
  • 分割開発・再利用・効率化の要

ライブラリを理解すると、
C言語での開発が「部品を組み立てる作業」に変わっていきます。