2012-03-10 15 views
0

std :: exceptionとstd :: runtime_errorのUnicode版を作成したかったのです。
だから私は、C++標準ライブラリから実装を取り出して、ユニコードをサポートするように変更するのが良い方法だと考えました。Visual C++標準ライブラリのキーワード

だから私は、ビジュアルC++でヘッダ例外 stdexcept提供をプルアップコードをコピーし、自分の変更を行いました。

事は、私が_CRTIMP_PUREを削除しない限り、私はそれをリンクすることができなかったです。 また、すべてのメンバー関数から接頭辞_EXCEPTION_INLINE __CLR_OR_THIS_CALLを削除しました。

これはうまくいっていますが、私はこれらのことが何をしているのか非常に不思議です。
_EXCEPTION_INLINEそれは文字通り#define _EXCEPTION_INLINEとして右のそれの上に定義された、と私のグーグルでのスキルは、彼らが何をすべきか上の任意のドキュメントを見つけることができません。

だから、誰でもこれらの目的を知っていますか?そしてなぜ私はクラスから接頭辞_CRTIMP_PUREを取り除くまでリンクしていませんか?

+3

あなたが 'unicode'と言うとき、 'char *'と 'std :: string'はUTF-8に完全に適しているので、あなたが実際に意味するのは「UTF-16」だと思います。 UTF-16に変換します。 –

+0

コピーして変更した後、少なくとも 'std :: exception'と' std :: runtime_error'の名前を変更しましたか?コンパイラが提供するハッキングされたライブラリクラスを共存させることは、災害のためのレシピのように思えます。 –

+1

@BenjaminLindley:WindowsではUnicodeは常にUTF-16としてエンコードされているので、Microsoftの* Unicode *と* UTF-16 *は互換性をもって使用されていると思います。 –

答えて

2

これらは本当に不思議なものではありません( - 少しだけ、それはそれらが定義されている場所の痛みPFビットを追跡するかもしれません)。それらはライブラリの一部であるヘッダーで定義され、現在の実行に対してコンパイラーがどのように構成されているかによって異なる定義をとります。特に、これらのマクロは、現在の実行が/clr:pureのために構成されているかどうかとほとんど関係しているようです。

_CRTIMP_PUREはあなたがCランタイムのDLLバージョンにリンク(および/clr:pureを構築していない)している場合__declspec(dllimport)に定義され、それ以外の場合は何も定義されています。

あなたのライブラリーは、DLL(またはDLLのランタイムが設定されるたびに、それは必ずしもDLLではありません場合)でない場合、あなたはそれを使用しないでください。 ビルドあなたのライブラリが使用されているとき(つまり、Cランタイムライブラリをビルドするときにマイクロソフトが行うこと)よりもライブラリを別に定義する必要があるため、おそらくそれを使用しないでください。

__CLR_OR_THIS_CALLはあなたが/clr:pureを構築している場合__clrcallで関数を宣言するために、Microsoftのライブラリが使用されている(唯一のマネージコードによって呼び出されますこれらの機能を示す - コンパイラは、それが思われる場合には、特定の最適化を行うことができます)。

最後に、を使用して、/clr:pureでビルドする場合、メンバー関数をclass exceptioninlineにします。

あなたはあなたのライブラリーのための/clrをサポートする予定がない限り、一番下の行は、__CLR_OR_THIS_CALL_EXCEPTION_INLINEを使用していない、とあなたはおそらく、あなたの実装で_CRTIMP_PUREを使うべきではありませんが、おそらくあなた自身の意思の似たようなを使用する必要がありますし、あなた自身のコントロールの下で。

1

標準のライブラリ実装コードでは、パフォーマンス/ドキュメント/信頼性の理由から、コンパイラ固有の拡張を使用することがよくあります。これらの拡張は、以降のバージョンのコンパイラで壊れる可能性があるため、独自のコードで使用しないでください。

インターフェースstd::exceptionや友人のを複製するには問題ありません、あなたはインスピレーションのためのVisual Studioの実装を見ることができます。しかし、あなたの実装では、公に文書化された言語/ライブラリの機能しか使用しないでください。

関連する問題