以下は STLport の Configuration Manual の適当訳(翻訳サイトの結果を適当にそれらしくしたもの).
おそらく ver3 なり ver4 なりの頃の説明で、最近(ver5) の事情は反映されておらず記述が古くなっている部分がある. (結構、無くなったり置き換わったり追加されたりがある模様)

STLport コンフィグレーション マニュアル

Boris Fomitchev 著

パラメータ

STLport コンフィグレーション・パラメータは2つのカテゴリーに大別できる。

  • ユーザー定義可能な設定
  • コンパイラのバグと欠落している機能に関するパラメータ

前者のパラメータは、いくつか特殊な機能をユーザーが選べぶためにある。 パラメータの設定は <stl_use_config.h>ヘッダ で行う。 ヘッダには設定できるパラメータの説明があるが、このマニュアルではいくつか情報を補足している。

後者のパラメータは、STLport が様々なコンパイラで使えるよう予め設定するためにある。 STLport が自動的に認識するコンパイラについては、(別の)一覧を参照のこと。 未対応のコンパイラをSTLportに対応させる場合には、このドキュメントが役立つだろう。

 

ユーザー定義可能な設定

STLportにはいくつか特殊機能を選ぶためのユーザー定義設定がある。設定方法は2通り

  1. <stl_user_config.h> で対応する #define 定義を設定する。 推奨方法。プロジェクトごとに異なる <stl_user_config.h> を使用できる。
  2. コンパイラのコマンドライン引数でフラグを指定する。いくつかのオプションの抑制もできる。 たとえば _STLP_USE_EXCEPTIONS マクロを 1 に設定して例外処理を有効にしている環境において、コマンドライン引数で -D_STLP_NO_EXCEPTIONS を指定すれば例外処理をオフにできる。

以下に安定したユーザー定義オプションの説明をする。特に示されていない場合これらのオプションはデフォルトで未定義になっている。

STLportのユーザー定義オプション

制御マクロ 説明
_STLP_NO_OWN_IOSTREAMS このスイッチで STLportの2つの主要な iostream モードから 1 つを選択。 詳しくは "はじめに" を参照のこと。
訳注: v5.2.1 ではすでに使用できない。
_STLP_NO_NEW_IOSTREAMS 新しい形式の iostreams が利用可能でも、利用しない。
訳注: v5.2.1 ではすでに存在しない。
_STLP_NO_IOSTREAMS 実験的なスイッチ。組み込み環境での利用を想定し、 iostreams を全く使用できない STLport を作成する。
訳注: .libを使わずヘッダのみでの利用を想定。(ヘッダのみにできないlocaleも使用できなくなる)
_STLP_NO_CUSTOM_IO 実験的なスイッチ。 (大抵はそうだろうが)カスタム型の basic_xxx iostreamクラスを用いない場合に定義できる。 "カスタム"型とは basic_ostream<my_char_type や my_traits<my_char_type> > のように charやwchar, char_traits<> でない型のこと。 このオプションがオンの場合、iostreamsの 非インラインのテンプレート関数定義の大部分は クライアントから見えない。 カスタム型を使う人が困らないように、デフォルトはオフになっている。 オンの場合、ほとんどのコンパイラでコンパイル時間を短縮でき、さらにオブジェクトファイルや実行ファイルのサイズを縮小できる。 あなたのプログラムを最適化なしでコンパイルして最適化されたライブラリをリンクする場合に最適化されたスタンダードI/O が使われることを保証する。 このオプションは STLport ライブラリ自体のビルドには影響しない。 基本的にプロジェクトごとに このオプションがあろうとなかろうと 同じライブラリ・バイナリを使うことができる。
_STLP_USE_DEBUG_LIB (Windows 用コンパイラのみ) 通常 _DEBUG を設定したプロジェクト(Debugビルド) をコンパイルする場合でも最適化されたSTLportライブラリが自動的にリンクされる。 Debugビルド時にDebugビルドされたSTLportライブラリを用いたいならば、このオプションを定義する。 (STLportライブラリを構築するとき "make all" は "release" と "stldebug" 版のライブラリを作るだけなので、 追加で "make debug_static debug_dynamic" を実行してデバッグフラグ有りのSTLportライブラリを作成しておく必要がある)
_STLP_USE_STATIC_LIB, _STLP_USE_STATICX_LIB, _STLP_USE_DYNAMIC_LIB (Windows 用コンパイラのみ) 通常、ランタイム・ライブラリの設定と一致するSTLportライブラリのバージョンが自動的にリンクされる。 (ダイナミック・ランタイム・ライブラリ DLL を使えば dynamic STLport DLL が使われる。逆もまた同じく) STLportライブラリとして static や dynamic, あるいは "staticx"(dynamic RTL を使う static STLportライブラリ)を強制したい場合は、 これらのオプションを指定のこと。
_STLP_NO_OWN_NAMESPACE 推奨動作の STLport の名前空間 _STL:: の使用を抑制し、強制的に STLport を std:: で使用する。 通常、STLport は std:: のかわりに _STL:: を使用することでコンパイラ付属の iostreams/strings を使用したときの衝突を防いでいる。
_STLP_USE_OWN_NAMESPACE 強制的に STLport のnamespace として std:: でなく _STL:: を用いる。 _STLP_USE_NAMESPACES が設定されている場合、自動的にこのフラグも設定される。
_STLP_DONT_RENAME_STD STLportが std:: を _STL:: に再定義(マクロ置換)しないようにする。 なんらかの理由でリネーミング・スキームがうまくいかない場合のみ定義のこと。
訳注: v5.2.1ではすでに存在しない。
_STLP_DEBUG Debugモード をオンにする。 スレッドセーフにして、iterator と範囲をチェックするようになる。
_STLP_USE_SYSTEM_ASSERT stderr を使った fprintf 実装のassertの代わりにシステム定義の assert を使う。
訳注: v5.2.1 ではすでに存在しない。
_STLP_DEBUG_MESSAGE コメントを外すと強制的に、全ての assertion チェック失敗時にユーザー定義のグローバル関数を直接呼ぶようになる。
void __stl_debug_message(const char * format_str, ...)
これによりデバッグ対象のための assertion を制御できるようになる。
注:このマクロを設定した場合、STLport利用側でどこかに __stl_debug_message 関数を定義する必要がある。
_STLP_DEBUG_TERMINATE コメントを外すと強制的に、全ての assertion チェック失敗時にユーザー定義のグローバル関数を実行するようになる。
void __stl_debug_terminate(void)。
これによりデバッグ対象の assertion でのふるまいを制御できる。 _STLP_NO_DEBUG_EXCEPTIONS が未定義ならデフォルトルーチンはユニークな例外を投げ、 定義されている場合は abort() が呼ばれる。
注:このマクロを設定した場合、STLport利用側でどこかに __stl_debug_terminate 関数を定義する必要がある。
_STLP_NO_DEBUG_EXCEPTIONS この定義をコメントすれば、__stl_debug_terminate() は abort() を呼ぶのでなく ユニークな例外を投げるようになる。
訳注: v5.2.1ではすでに存在しない。
_STLP_NO_EXCEPTIONS STLport内の例外コードの使用を抑止する。
_STLP_NO_NAMESPACES コンパイラが namespace をサポートしていても STLport をグローバルの名前空間に置く。
訳注: v5 ではコンパイラが namespace をサポートしていることを前提に組まれている。
_STLP_NO_RELOPS_NAMESPACE 定義されている場合、関係演算子を名前空間 std::rel_ops に入れない。
_REENTRANT プロジェクトがマルチスレッドの場合に定義する。 STLport で マルチスレッドセーフなアロケータをサポートする。
_NOTHREADS 定義すると、STLport でマルチスレッディング・サポートを使用しない。
_STLP_NO_NEW_C_HEADERS 定義されると、利用可能でも(C++で追加された)新しいスタイルのCヘッダを使用しない。
_STLP_USE_RAW_SGI_ALLOCATORS 標準仕様の allocator<> のかわりに、 旧来の SGIスタイルのアロケータをコンテナのデフォルトに強制使用する。
訳注: v5.2.1ではすでに存在しない。
_STLP_USE_MALLOC 定義すると平坦な malloc() を用いた allocator<> を使用し、 SGI製の最適化ノードアロケータエンジンの使用をやめる。
_STLP_USE_NEWALLOC 定義すると平坦な new() を用いた allocator<> を使用し、 SGI製の最適化ノードアロケータエンジンの使用をやめる。
_STLP_DEBUG_ALLOC メモリーの一貫性をチェックしたりするデバッグ用の allocator<> を使用する。
_STLP_DEBUG_UNINITIALIZED あなたのクラスの未初期化のメンバー変数を検出したいときにこのオプションを使う。 これを設定時、construct() と destroy() はクラスストレージを 値 _STLP_SHRED_BYTE(後述) で埋めるようになる。
注: _STLP_DEBUG, _STLP_DEBUG_ALLOC マクロを定義しても このオプションは自動的には設定されない。
_STLP_SHRED_BYTE _STLP_DEBUG_ALLOC または _STLP_DEBUG_UNINITIALIZED が定義されているとき、初期化前のメモリをこの定義のバイト値で埋めるようになる。 なるべく参照不可能なアドレスになったり問題を引き起こすような値を選ぶこと。 プラットフォームによっては予め適切な値が設定されているかもしれない。stldebug.h を参照のこと。
_STLP_DONT_THROW_RANGE_ERRORS このマクロは、コンテナ(vectorとdeque)のメンバー関数at()を使えないようにする。 範囲エラー例外を投げない at() は用意するのでなく、 このマクロを定義すると at()メソッドが定義されなくなる。
_STLP_MSVC50_COMPATIBILITY これを定義すると、SGI reverse_iterator をMSVCライブラリの他の部分と互換性があるようにする。(部分特殊化は効果がない)。 MSVC5.0 を使う場合には必須で、自動的に設定される。
_STLP_USE_MFC MFC を用いる場合はこのマクロを定義する必要がある。 STLport の <stl/_config.h> で同期プリミティブを取得するのに <windows.h> の代わりに <afx.h> をincludeするようになる。
_STLP_MINIMUM_DEFAULT_TEMPLATE_PARAMS たとえば map<> や set<>. のように1つ以上のデフォルト・テンプレート引数を持つ場合に最小限の設定を使うようにする。 _STLP_LIMITED_DEFAULT_TEMPLATES がオンの場合のみ効果がある。
訳注:v5.2.1 では若干残っている箇所もあるが実質 使えなくなっている。
_STLP_NO_PROXY_ARROW_OPERATOR STLportではデフォルトでイテレーターのoperator-> で使用されていないインスタンス化の戻り値の型をチェックするようプロクシテクニックを使っている。 この機能が不具合を起こす場合は このスイッチで ->オペレータのプロクシを無効にできる。
訳注: v5.2.1ではすでに存在しない。
_STLP_USE_ABBREVS リンカーを補助するため 内部(インターフェースには影響しない範囲)で使うクラス名を(短く)略した名前で生成するようにする。 このオプションはもう不要だろうが、このリリースではまだ機能するだろう。
訳注:あまり長い名前を扱えない古いリンカー対策。dmcではまだ必要かも。
_STLP_USE_DECLSPEC (廃止, Windows 専用) このスイッチは DLL からエクスポートできるSTLportのシンボルを作成する。 export 特性を使う場合、すべてのコンパイル単位でこのマクロを定義する必要があり、かつ、 STLport シンボルを使う いづれかの DLL で _STLP_DESIGNATED_DLL マクロを定義する必要がある。 STLport の iostream を使用せずにデフォルトのノードアロケータを使用してDLL境界を越えてオブジェクトを渡す場合、この機能を使用する必要がある。 STLport の iostream を使い /MDフラグでコンパイルする場合は自動的にこの定義が行われる。
_STLP_DESIGNATED_DLL (廃止, Windows 専用) _STLP_USE_DECLSPEC といっしょにこのスイッチを使うと、作成した DLL で他のモジュール用に STLportシンボルをエクスポートするようになる。 DLLシンボルをエクスポートするライブラリは、これらのスイッチの双方が定義されてコンパイルされる必要があり、 少なくとも1つのソースファイルにはにヘッダを含める必要がある。 通常これを使うべきではないが、STLport DLL を構築するときに 内部的に用いられる。

注:

  • Purify(c) や Codeguard(c)、BoundsChecker(c) のようなツールを使う場合、 _STLP_USE_MALLOC_STLP_USE_NEWALLOC を #define するのを勧める。 そうでないとSTL内部構造の大部分でポインターチェックが効かず、それではそれらのツールを使う意味が無い。

 

コンパイラ特性スイッチ

コンパイラ特性スイッチは、コンパイラの(欠点)特性/バグ を表している STLport マクロだ。 下記のテーブルでそれらを記述する。 バグなく完璧に ANSI C++ 仕様を実装したコンパイラならば、コンフィグファイルは空になっているだろう:)

STLportでは、多数のスイッチの設定を助けるスクリプトを用意している。 configure 実行 の章にツールの使い方があるので読んでください。

注:"configure"の実行で最適な設定ができるとは期待しないように。
あくまで初期設定過程の支援としてのみ提供している。

コンパイラ特性についての STLport マクロ の説明

制御マクロ名 説明 デフォルト
_STLP_UINT32_T 符号無 32ビット整数型。 unsigned long
_STLP_LONG_LONG コンパイラが標準以外のlong long 型のみをサポートする場合に定義。 Off
_STLP_NO_WCHAR_T コンパイラが wchar_t型を持たない場合に定義。 Off
_STLP_WCHAR_T_IS_USHORT wchar_t がユニークな型でなく unsigned short を typedef していた場合に定義。 Off
_STLP_NO_LONG_DOUBLE コンパイラが long double 型をサポートしない場合に定義。 Off
_STLP_NO_TYPENAME コンパイラが typename 識別子をサポートしない場合に定義 Off
_STLP_NO_EXPLICIT コンパイラが explicit 識別子をサポートしない場合に定義 Off
_STLP_NO_MUTABLE コンパイラが mutable 識別子をサポートしない場合に定義 Off
_STLP_NO_NEW_STYLE_CASTS コンパイラが新しいスタイルのキャスト(const_cast<>)をサポートしない場合に定義 Off
_STLP_NO_BOOL コンパイラが bool をサポートしない場合に定義 Off
_STLP_DONT_USE_BOOL_TYPEDEF コンパイラが bool をサポートしないが将来のため予約語になっている(typedef出来ない)場合に定義 Off
_STLP_YVALS_H true/false が定義される <yvals.h> ヘッダを使う場合に定義。 (Visual C++ 4.2) Off
_STLP_DEFAULT_TEMPLATE_PARAM コンパイラがデフォルトtemplateパラメータをサポートしない場合に定義。
訳注:STLport 5.2.1ではすでに存在しない
Off
_STLP_DEFAULT_TYPE_PARAM コンパイラがデフォルトパラメータとして、完全型しかサポートしていない場合に定義。 Off
_STLP_LIMITED_DEFAULT_TEMPLATES コンパイラが非型のデフォルトテンプレートパラメータを扱えない場合に定義 Off
_STLP_NON_TYPE_TMPL_PARAM_BUG コンパイラが 非型のテンプレートパラメータを持つ関数でトラブルがある場合に定義。 Off
_STLP_NO_STATIC_TEMPLATE_DATA コンパイラが static な class データのtemplate定義をサポートしない場合に定義。
訳注:v5.2.1ではすでに存在しない
Off
_STLP_STATIC_CONST_INIT_BUG コンパイラが class 内の static のclassデータtemplate なメンバーの初期化をサポートしない場合に定義。 Off
_STLP_WEAK_ATTRIBUTE コンパイラが __attribute((weak))__ を扱える場合に拡張してコンストラクトする。 (gcc 2.7.2 のように) static なテンプレートデータメンバーを扱えない場合に必要となる。
訳注:STLport 5.2.1ではすでに存在しない
Off
_STLP_HAS_NO_NAMESPACES コンパイラが名前空間をサポートしない場合に定義 Off
_STLP_BROKEN_USING_DIRECTIVE "using" キーワードが template 型で使えない場合に定義 Off
_STLP_HAS_NO_EXCEPTIONS コンパイラが 例外処理を扱えない場合に定義。 Off
_STLP_NO_EXCEPTION_SPEC コンパイラが例外の仕様をサポートしない場合に定義 Off
_STLP_THROW_RETURN_BUG throw() のあとに return 文が必要なコンパイラの場合に定義 Off
_STLP_NO_BAD_ALLOC ヘッダ <new> で bad_alloc 例外が定義されていないコンパイラの場合に定義。 Off
_STLP_NO_MEMBER_TEMPLATES コンパイラがメンバー(関数)テンプレートをサポートしない場合に定義。 Off
_STLP_NO_MEMBER_TEMPLATE_CLASSES コンパイラがメンバー クラス テンプレートをサポートしない場合に定義。 Off
_STLP_NO_FRIEND_TEMPLATES コンパイラが firend テンプレートをサポートしない場合に定義。
訳注:v5.2.1ではすでに存在しない
Off
_STLP_NO_QUALIFIED_FRIENDS コンパイラが namespace名付の frend 宣言を受け付けない場合に定義。
訳注:v5.2.1ではすでに存在しない
Off
_STLP_NO_CLASS_PARTIAL_SPECIALIZATION コンパイラがクラステンプレートの部分特殊化をサポートしない場合に定義。 Off
_STLP_PARTIAL_SPEC_NEEDS_TEMPLATE_ARGS 部分的に特化しているクラスには、メソッド宣言に自身のフルネーム(テンプレートパラメータ)が必要 Off
_STLP_PARTIAL_SPECIALIZATION_BUG 部分特殊化で新しいスタイルのreverse_iteratorを使うときにバグになる場合に定義。
訳注:v5.2.1ではすでに存在しない
Off
_STLP_MEMBER_SPECIALIZATION_BUG コンパイラが部分特殊化クラスのメンバーに固有のバグを保つ場合に定義。
訳注:v5.2.1で#defineは残っているがそれを参照しているものがない
Off
_STLP_NO_METHOD_SPECIALIZATION コンパイラが 単一のテンプレートメソッドの特殊化をサポートしていない場合に定義。 Off
_STLP_NO_FUNC_PARTIAL_ORDERING コンパイラが部分テンプレート関数の順序をサポートしていない場合に定義。
訳注:v5.2.1ではすでに存在しない
Off
_STLP_NO_PARTIAL_SPECIALIZATION_SYNTAX コンパイラがテンプレートの特殊化の文法をサポートしない場合に定義 Off
_STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS コンパイラが関数の明示的なテンプレート引数をサポートしない場合に定義 Off
_STLP_AUTOMATIC_TYPE_TRAITS コンパイラが あらゆる型のために予め特殊化したクラス type_traits<T>を用意してある場合に定義。 これは拡張機能。
訳注:v5.2.1ではすでに存在しない
Off
_STLP_LOOP_INLINE_PROBLEMS コンパイラが while(), for() 含むinline関数をコンパイル出来ない場合に定義。 Off
_STLP_BASE_MATCH_BUG コンパイラが基本型のテンプレート関数引数でマッチに失敗する場合に定義 Off
_STLP_NONTEMPL_BASE_MATCH_BUG コンパイラが (非テンプレートの)ベース型のテンプレート関数引数のマッチに失敗する場合に定義。 Off
_STLP_NESTED_TYPE_PARAM_BUG コンパイラが メソット定義の外観部(引数型や返値型)でclassをネストした型やtypedef名を明示して使うのを拒否する場合に定義。
Off
_STLP_TYPENAME_ON_RETURN_TYPE コンパイラが メソット定義の外観部(引数型や返値型)でclassをネストした型やtypedef名を明示して使うのにキーワードtypenameを必要とする場合に定義。
Off
_STLP_BASE_TYPEDEF_BUG コンパイラが typedef に深刻な問題をもつ場合に定義 Off
_STLP_BASE_TYPEDEF_OUTSIDE_BUG ベースclassのtypedef名が外から見えない場合に定義
訳注:v5.2.1で#defineは残っているがそれを参照しているものがない
Off
_STLP_MEMBER_POINTER_PARAM_BUG コンパイラが、関数引数としてメンバーへのポインタを扱えない場合に定義。 Off
_STLP_UNINITIALIZABLE_PRIVATE コンパイラが、staticなpriavateデーターメンバーの初期化に問題がある場合に定義。
訳注:v5.2.1ではすでに存在しない
Off
_STLP_STATIC_ARRAY_BUG コンパイラが、enumで定義された要素数でのstaticな配列メンバーの具現化にトラブルが有る場合に定義。
訳注:v5.2.1ではすでに存在しない
Off
_STLP_DEFAULT_CONSTRUCTOR_BUG コンパイラが、組み込みの 整数型のデフォルトコンストラクタで0への初期化ができない場合に定義。
訳注:v5.2.1ではすでに存在しない
Off
_STLP_CONST_CONSTRUCTOR_BUG コンパイラが、constオブジェクトでメンバーのデフォルトコンストラクタの呼び出しに失敗する場合に定義。 Off
_STLP_TRIVIAL_CONSTRUCTOR_BUG コンパイラが、POD型のコンストラクタの呼び出しにトラブルがある場合に定義 Off
_STLP_TRIVIAL_DESTRUCTOR_BUG コンパイラが、POD型のデストラクタの呼び出しにトラブルがある場合に定義 Off
_STLP_MULTI_CONST_TEMPLATE_ARG_BUG map/set でconstにされているキーの型に特化した問題 Off
_STLP_NO_ARROW_OPERATOR
__SGI_STL_NO_ARROW_OPERATOR
SGI 製 iterator の -> operator の使用をやめる。 プロキシ回避策として用意。 Off
_STLP_NO_AT_MEMBER_FUNCTION コンテナのメンバー関数 at() を使えなくする。
訳注:v5.2.1では、at(n)自体は存在し例外を投げなくなっている。
Off
_STLP_HAS_NO_NEW_IOSTREAMS ネイティブ(コンパイラ付属)のC++ライブラリが template実装された新しいスタイルの iostreams を提供していない場合に定義。
訳注:v5.2.1ではすでに存在しない
Off
_STLP_NO_EXCEPTION_HEADER <exception> ヘッダが欠乏しているコンパイラの場合に定義 Off
_STLP_HAS_NO_NEW_C_HEADERS ネイティブ(コンパイラ付属)のC++ライブラリが <cstddef> のような新しいスタイルのCヘッダを持たず、 <stddef.h> のような古いスタイルのものしか持っていない場合に定義。 Off
_STLP_NO_NEW_NEW_HEADER ネイティブ(コンパイラ付属)のC++ライブラリが 新しいスタイルの <new> ヘッダを持っていない場合に定義。 Off
_STLP_VENDOR_GLOBAL_STD コンパイラが提供するC++標準ライブラリが置かれる名前空間が std:: でなくグローバルの名前空間を使う場合に定義。 std::
_STLP_VENDOR_GLOBAL_CSTD コンパイラが提供するC標準ライブラリが置かれる名前空間が std:: でなくグローバルの名前空間を使う場合に定義。 Off
_STLP_RAND48 Cライブラリに関数 lrand48() がある場合に定義。 Off
_STLP_NATIVE_INCLUDE_PATH ネイティブ(コンパイラ付属)ヘッダが置かれているパス。 相対パスか絶対パスで指定。
STLport は _STL:: 名前空間に std:: の名前をインポートするのにこの情報を使う。 デフォルトは ../include
ヒント: include で終わるディレクトリに STLport を絶対にインストールしないこと。
../include
_STLP_NATIVE_C_INCLUDE_PATH ネイティブ(コンパイラ付属)の stdio.hのようなCヘッダが置かれているパス。 相対パスか絶対パスで指定。 ../include
_STLP_NATIVE_CPP_C_INCLUDE_PATH ネイティブ(コンパイラ付属)の cstdioのような新しいスタイルのCヘッダが置かれているパス。 相対パスか絶対パスで指定。 ../include
_STLP_MAKE_HEADER このマクロは ディレクトリと名前でヘッダパスを作る。 コンパイラが "/" を理解しない場合、マクロの変更が必要。 <path/header>
_STLP_NATIVE_HEADER(header) このマクロは ネイティブパスから header ファイルを include ためにある。 プリプロセッサに問題がある場合はマクロを修正すること。 See stl_config.h
_STLP_NATIVE_C_HEADER(header) 古いスタイルのCヘッダ用ということ以外は _STLP_NATIVE_HEADER(header)に同じ。 See stl_config.h
_STLP_NATIVE_CPP_C_HEADER(header) 新しいいスタイルのCヘッダ用ということ以外は _STLP_NATIVE_HEADER(header) に同じ。 See stl_config.h
_STLP_LINK_TIME_INSTANTIATION コンパイラが、templateの分割コンパイル・モデルをサポートしていて 非inline関数やメソッドの実装を .c ファイルに置けるような場合に定義。 Off