0

私はstlportと呼ばれるライブラリを使用しています。これは、次のstdように名前空間 を再定義します。

# if defined (_STLP_REDEFINE_STD)
/*  We redefine "std" to "stlport", so that user code may use std:: transparently */
#   undef  std
#   define std STLPORT
# else

このため、コード内で使用しようとすると、どこでも。std::somethingに置き換えられ_STLP::somethingます。

行をコメントアウトする#define std STLPORTと、レガシープロジェクトのコードはコンパイルされません(stlportに依存します)。

行をコメントアウトしないと、追加しようとしている新しいライブラリは、std::stlportが使用するものとは異なるアロケータのセットで使用されるため、コンパイルされません。衝突を入力します。

#define STLPORT std新しいライブラリを含める直前に一列に並べ てみましたが、この#defineは機能していないようです。

このように再定義されたノーマルを使用する方法はありstdますか?

4

2 に答える 2

1

次のようなものを使用できます。

# if defined (_STLP_REDEFINE_STD)
#   undef  std
#   define std STLPORT
# else

//....

#ifdef std
#define std_WAS_DEFINED
#undef std
#endif

//new code

#ifdef std_WAS_DEFINED
#define std STLPORT
#endif

//legacy code
于 2012-03-19T07:53:04.720 に答える
1

STLには2つの異なる実装があります。1つはSTLPORTにあり、もう1つは標準ライブラリにあります。古いコードにはSTLPORTが必要であり、新しいコードには標準ライブラリが必要です。

新しいコードと古いコードはどちらも次のようなものを使用しますが、という名前の異なるインクルードファイルinclude <vector>が必要であるため、異なるコンパイラフラグが必要です。同じコンパイラ設定でコンパイルすることはできません。vector-I

古いコードと新しいコードの間で標準コンテナやその他のSTL関連データを交換する必要がない場合は、STLPORT設定を使用して古いコードをコンパイルし、通常の設定を使用して新しいコードをコンパイルできます。stdSTLPORTインクルードに触れたり、コードで再定義したりしないでください。STLPORTはそのように使用されることを意図していません。これは、標準ライブラリ(の一部)のドロップイン置換として意図されています。(またはSTLPORT)ソースを変更するのではなく、適切なコンパイラフラグを選択して、使用するフラグを選択します。

古いコードと新しいコードの間で標準のコンテナを交換する必要がある場合は、運が悪いです。唯一の手段は、標準に準拠するようにレガシーコードを変更することです。

于 2012-03-19T09:08:16.240 に答える