ライブラリ

ころころビルドオプションを変えるな!

久々にCygwinをアップデートしたのですが、TOPPERS/ASPカーネルのコンフィギュレータをビルドしようとすると、次のエラーが大量に出ました。

undefined reference to `__Unwind_SjLj_Unregister'

第12回 標準Cライブラリ

いったんは連載を終えた「C++プログラマのためのC言語入門」ですが、ここまでの時点で扱い切れなかった話題を少し補足するために、連載を再開することにします。今回解説するのは、標準Cライブラリについてです。Cでは、C++の標準ライブラリのうち、当然のことながら標準Cライブラリに当たる部分しかサポートされません。しかし、標準Cライブラリの範疇でも、若干のちがいがあります。

ヘッダファイルの書き方 - その2

ライブラリのヘッダファイルを書く際には、名前空間の汚染に注意しなければなりません。ここでいう「名前空間」とは、C++の namespace のことではなく、もう少し広い意味で使っています。具体的には、名前空間有効範囲を含む有効範囲、マクロの影響範囲、および外部結合を持つ識別子の全体を指しています。

クライアントコードや他のライブラリから身を守るため、そして、クライアントコードや他のライブラリを破壊するのを防ぐためにも、名前空間の汚染に関して理解しておく必要があります。そうでなければ、ライブラリの外部に存在するコードによって引き起こされる、不可解な現象に悩まなければなりません。

ライブラリ内部で使用する識別子

ライブラリの実装上の都合により、ヘッダファイルの中でいくつかの識別子を導入しなければならないことがよくあります。例えば、クラスの非公開メンバ、関数宣言の仮引数、インライン関数や関数テンプレートの定義で用いる局所変数などです。何も考えずにこれらの識別子を命名してしまうと、クライアントコードや他のライブラリによってコードを破壊されるおそれがあります。

ヘッダファイルの書き方 - その1

ライブラリのヘッダファイルの書き方は、特定のアプリケーション専用のヘッダファイルの書き方とそれほど変わりません。違うとすれば、移植性をどの程度考慮するかということと、名前空間の汚染に関する配慮ぐらいかと思います。あとは使い勝手に関してですが、これはアプリケーションの場合でも配慮すべき事柄です。

インクルードガード

C++では、クラス・関数・オブジェクトの定義が同じ翻訳単位に重複して現れるとエラーになります。これは、いわゆる単一定義規則とは別の話で、インライン関数やテンプレートの場合にもあてはまります。具体的には、

1 ファイル 1 関数主義

今から8年半ほど前、今はなき月刊誌「Cマガジン」に、「プログラミングの禁じ手 C言語編」というのが掲載されていました。その後も比較的長期にわたってCマガジンのウェブサイトに掲載されていたのですが、現在ではそれも削除されてしまっています*1。その後、「Cマガジン」に掲載された類似の記事を再編集した「すべてのプログラマに効く 危険なプログラムの処法箋」という書籍が出ていますので、興味のある方はご覧になられるとよいでしょう。

「技術情報」に「ライブラリ開発入門」を追加しました。

タイトルのとおりなのですが、「技術情報」「ライブラリ開発入門」を追加しました。いつものことですが、ゆっくり目のペースでコンテンツを増やしていく予定ですので、気長にお付き合いください。

当面は、Visual C++でのライブラリ開発に限定した形で進めていきますが、ツールの使いか対外はC++共通のものですので、他の環境でも十分応用がきくはずです。この辺りに関しても、リクエストがございましたら、メール等でご連絡いただければと思います。

Visual C++ 2008でライブラリを開発する。

ライブラリを開発するには、ツールの使い方も習得する必要があります。今回は、Microsoft Visual C++ 2008を用いて、スタティックライブラリを作る方法について解説します。なお、サンプルとして掲載している画像はExpress Editionのものですが、Standard Edition以上でも同様にすればスタティックライブラリを作れるはずです。

まずはプロジェクトを作成します。[ファイル]メニューから[新規作成]→[プロジェクト]を選択し、「新しいプロジェクト」ダイアログを開きます(下記)。「新しいプロジェクト」では、「プロジェクトの種類」としてWin32を、テンプレートとして「Win32 コンソール アプリケーション」を選択します。そして、プロジェクト名を入力したあと「OK」ボタンをクリックします。

ライブラリ開発入門

プログラム言語の入門サイトは世の中にあふれかえっています。しかし、ライブラリの入門サイトはあまり見かけません。そこで、ここではC++用のライブラリ開発を行う上での基礎的な情報を掲載していくことにします。

コンテンツ配信