JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: C++ ユーザーズガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

パート I C++ コンパイラ

1.  C++ コンパイラの紹介

2.  C++ コンパイラの使用方法

3.  C++ コンパイラオプションの使い方

パート II C++ プログラムの作成

4.  言語拡張

5.  プログラムの編成

6.  テンプレートの作成と使用

7.  テンプレートのコンパイル

8.  例外処理

9.  プログラムパフォーマンスの改善

10.  マルチスレッドプログラムの構築

パート III ライブラリ

11.  ライブラリの使用

11.1 C ライブラリ

11.2 C++ コンパイラ付属のライブラリ

11.2.1 C++ ライブラリの説明

11.2.2 C++ ライブラリのマニュアルページへのアクセス

11.2.3 デフォルトの C++ ライブラリ

11.3 関連するライブラリオプション

11.4 クラスライブラリの使用

11.4.1 iostream ライブラリ

11.4.1.1 従来の iostream およびレガシー RogueWave ツールについての注意

11.4.2 C++ ライブラリのリンク

11.5 標準ライブラリの静的リンク

11.6 共有ライブラリの使用

11.7 C++ 標準ライブラリの置き換え

11.7.1 置き換え可能な対象

11.7.2 置き換え不可能な対象

11.7.3 代替ライブラリのインストール

11.7.4 代替ライブラリの使用

11.7.5 標準ヘッダーの実装

11.7.5.1 標準 C++ ヘッダーの置き換え

11.7.5.2 標準 C ヘッダーの置き換え

12.  C++ 標準ライブラリの使用

13.  従来の iostream ライブラリの使用

14.  ライブラリの構築

パート IV 付録

A.  C++ コンパイラオプション

B.  プラグマ

用語集

索引

11.7 C++ 標準ライブラリの置き換え

ただし、コンパイラに添付された標準ライブラリを置き換えることは危険で、必ずしもよい結果につながるわけではありません。基本的な操作は、コンパイラとともに提供される標準のヘッダーとライブラリを無効にして、新しいヘッダーファイルとライブラリがあるディレクトリと、ライブラリ自身の名前を指定することです。

コンパイラでは、標準ライブラリの STL ポートおよび Apache stdcxx 実装がサポートされます。詳細は、「12.2 STLport」「12.3 Apache stdcxx 標準ライブラリ」を参照してください。

11.7.1 置き換え可能な対象

ほとんどの標準ライブラリおよびそれに関連するヘッダーは置き換え可能です。置き換えるライブラリが libCstd である場合は、次の関連するヘッダーも置き換える必要があります。

<algorithm> <bitset> <complex> <deque> <fstream <functional> <iomanip> <ios> <iosfwd> <iostream> <istream> <iterator> <limits> <list> <locale> <map> <memory> <numeric> <ostream> <queue> <set> <sstream> <stack> <stdexcept> <streambuf> <string> <strstream> <utility> <valarray> <vector>

ライブラリの置き換え可能な部分は、いわゆる「STL」と呼ばれているもの、文字列クラス、iostream クラス、およびそれらの補助クラスです。このようなクラスとヘッダーは相互に依存しているため、それらの一部を置き換えるだけでは通常は機能しません。一部を変更する場合でも、すべてのヘッダーと libCstd のすべてを置き換える必要があります。

11.7.2 置き換え不可能な対象

標準ヘッダー <exception><new>、および <typeinfo> は、コンパイラ自身とlibCrun に密接に関連しているため、これらを置き換えることは安全ではありません。ライブラリ libCrun は、コンパイラが依存している多くの「補助」関数が含まれているため置き換えることはできません。

C から派生した 17 個の標準ヘッダー (<stdlib.h><stdio.h><string.h> など) は、Oracle Solaris オペレーティングシステムと基本 Solaris 実行時ライブラリ libc に密接に関連しているため、これらを置き換えることは安全ではありません。これらのヘッダーの C++ バージョン (<cstdlib><cstdio><cstring> など) は基本の C バージョンのヘッダーに密接に関連しているため、これらを置き換えることは安全ではありません。

11.7.3 代替ライブラリのインストール

代替ライブラリをインストールするには、まず、代替ヘッダーの位置と libCstd の代わりに使用するライブラリを決定する必要があります。理解しやすくするために、ここでは、ヘッダーを /opt/mycstd/include にインストールし、ライブラリを /opt/mycstd/lib にインストールすると仮定します。ライブラリの名前は libmyCstd.a であると仮定します。(ライブラリ名は通常 “lib” で始まります。)

11.7.4 代替ライブラリの使用

コンパイルごとに -I オプションを指定して、ヘッダーがインストールされている位置を指示します。さらに、-library=no%Cstd オプションを指定して、コンパイラ独自のバージョンの libCstd ヘッダーが検出されないようにします。例:

example% CC -I/opt/mycstd/include -library=no%Cstd... (compile)

-library=no%Cstd オプションを指定しているため、コンパイル中、コンパイラ独自のバージョンのヘッダーがインストールされているディレクトリは検索されません。

プログラムまたはライブラリのリンクごとに -library=no%Cstd オプションを指定して、コンパイラ独自の libCstd が検出されないようにします。さらに、-L オプションを指定して、代替ライブラリがインストールされているディレクトリを指示します。さらに、-l オプションを指定して、代替ライブラリを指定します。例:

example% CC -library=no%Cstd -L/opt/mycstd/lib -lmyCstd... (link)

あるいは、-L-l オプションを使用せずに、ライブラリの絶対パス名を直接指定することもできます。例:

example% CC -library=no%Cstd /opt/mycstd/lib/libmyCstd.a... (link)

-library=no%Cstd オプションを指定しているため、リンク中、コンパイラ独自のバージョンの libCstd はリンクされません。

11.7.5 標準ヘッダーの実装

C には、<stdio.h><string.h><stdlib.h> などの 17 個の標準ヘッダーがあります。これらのヘッダーは Oracle Solaris オペレーティングシステムの一部として提供され、/user/include にあります。C++ にも同様のヘッダーがありますが、さまざまな宣言の名前が大域名前空間と std 名前空間の両方に存在するという要件が付加されています。

また、C++ には、C 標準ヘッダー (<cstdio> <cstring><cstdlib> など) のそれぞれについても専用のバージョンがあります。C++ 版の C 標準ヘッダーでは、宣言名は std 名前空間にのみ存在します。C++ には、32 個の独自の標準ヘッダー (<string><utility><iostream> など) も追加されています。

標準ヘッダーの実装で、C++ ソースコード内の名前がインクルードするテキストファイル名として使用されているとしましょう。たとえば、標準ヘッダーの <string> (または <string.h>) が、あるディレクトリにある string (または string.h) というファイルを参照するものとします。この実装には、次の欠点があります。

こうした問題を解決するため、コンパイラの include ディレクトリには、ヘッダーと同じ名前を持つファイルと、 一意の接尾辞 .SUNWCCh を持つ、そのファイルへのシンボリックリンクが含まれています。 SUNW はコンパイラに関係するあらゆるパッケージに対する接頭辞、CC は C++ コンパイラの意味、.h はヘッダーファイルの通常の接尾辞です。つまり <string> と指定された場合、コンパイラは <string.SUNWCCh> と書き換え、その名前を検索します。接尾辞付きの名前は、コンパイラ専用の include ディレクトリにだけ存在します。このようにして見つけられたファイルがシンボリックリンクの場合 (通常はそうである)、コンパイラは、エラーメッセージやデバッガの参照でそのリンクを 1 回だけ間接参照し、その参照結果 (この場合は string) をファイル名として使用します。ファイルの依存関係情報を送るときは、接尾辞付きの名前の方が使用されます。

この名前の書き換えは、2 つのバージョンがある 17 個の標準 C ヘッダーと 32 個の標準 C++ ヘッダーのいずれかを、パスを指定せずに山括弧 < > で囲んで指定した場合にだけ行われます。山括弧の代わりに引用符が使用されるか、パスが指定されるか、ほかのヘッダーが指定された場合、名前の書き換えは行われません。

次の表は、よくある書き換え例をまとめています。

表 11-3 ヘッダー検索の例

ソースコード
コンパイラによる検索
注釈
<string>
string.SUNWCCh
C++ の文字列テンプレート
<cstring>
cstring.SUNWCCh
C の string.h の C++ 版
<string.h>
string.h.SUNWCCh
C の string.h
<fcntl.h>
fcntl.h
標準 C および C++ ヘッダー以外
"string"
string
山括弧ではなく、二重引用符
<../string>
../string
パス指定がある場合

コンパイラが header.SUNWCCh (header はヘッダー名) を見つけられない、コンパイラは、#include 指令で指定された名前で検索し直します。たとえば、#include <string> という指令を指定した場合、コンパイラは string.SUNWCCh という名前のファイルを見つけようとします。この検索が失敗した場合、コンパイラは string という名前のファイルを探します。

11.7.5.1 標準 C++ ヘッダーの置き換え

「11.7.5 標準ヘッダーの実装」で説明している検索アルゴリズムのため、「11.7.3 代替ライブラリのインストール」で説明している SUNWCCh バージョンの代替 ヘッダーを指定する必要はありません。ただし、記載されているいくつかの問題が発生した場合、推奨される解決方法は、接尾辞が付いていないヘッダーごとに、接尾辞 .SUNWCCh を持つシンボリックリンクを追加することです。つまり、ファイルが utility の場合、次のコマンドを実行します。

example% ln -s utility utility.SUNWCCh

utility.SUNWCCh というファイルを探すとき、コンパイラは 1 回目の検索でこのファイルを見つけます。そのため、utility という名前のほかのファイルやディレクトリを誤って検出してしまうことはありません。

11.7.5.2 標準 C ヘッダーの置き換え

標準 C ヘッダーの置き換えはサポートされていません。それでもなお、独自のバージョンの標準ヘッダーを使用する場合、推奨される手順は次のとおりです。

たとえば、<stdio.h><cstdio> の代替ヘッダーがあるとします。stdio.hcstdio をディレクトリ /myproject/myhdr に置きます。このディレクトリ内で、次のコマンドを実行します。

example% ln -s stdio.h stdio.h.SUNWCCh
example% ln -s cstdio cstdio.SUNWCCh

コンパイルのたびに、オプション -I/myproject/mydir を使用します。

警告: