1

std::exceptionとstd::runtime_errorのユニコードバージョンを書きたかったのです。
そこで、C ++標準ライブラリから実装を取得し、Unicodeをサポートするように変更するよりも良い方法を考えました。

そこで、Visual C ++で例外ヘッダーとstdexceptヘッダーを取得し、コードをコピーして、変更を加えました。

問題は、を削除しない限り、リンクを取得できなかったこと_CRTIMP_PUREです。_EXCEPTION_INLINE __CLR_OR_THIS_CALLまた、すべてのメンバー関数からプレフィックスを削除しました。

それは機能していますが、私はそれらすべてが何をしたのか非常に興味があります。
_EXCEPTION_INLINEそれは文字通りそのすぐ上にあると定義されており#define _EXCEPTION_INLINE、私のグーグルスキルは彼らが何をしているのかについてのドキュメントを見つけることができません。

それで、誰かがこれらが何をすることを意味するのか知っていますか?_CRTIMP_PUREそして、クラスからプレフィックスを削除するまでリンクされないのはなぜですか?

4

2 に答える 2

2

これらは実際には不思議なことではありません (しかし、それらがどこで定義されているかを追跡するのは少し面倒かもしれませんが、ほんの少しです)。これらは、ライブラリの一部であるヘッダーで定義されており、現在の実行用にコンパイラがどのように構成されているかに応じて、異なる定義を取ります。特に、これらのマクロは、現在の実行が 用に構成されているかどうかに主に関係しているようです/clr:pure

_CRTIMP_PURE__declspec(dllimport)、C ランタイムの DLL バージョンに対してリンクしている場合 (および でビルドしてい/clr:pureない場合) に定義され、それ以外の場合は何も定義されていません。

ライブラリが DLL でない場合 (または、DLL ランタイムが構成されているときに必ずしも DLL であるとは限らない場合)、それを使用しないでください。ライブラリを使用するときとは異なる方法でライブラリをビルドする必要があるため、とにかく使用しないでください (これは、Microsoft が C ランタイム ライブラリをビルドするときに行うことです)。

__CLR_OR_THIS_CALL__clrcallを使用してビルドする場合、関数を宣言するために Microsoft のライブラリによって使用されます/clr:pure(これらの関数はマネージ コードによってのみ呼び出されることを示します - その場合、コンパイラは特定の最適化を実行できるようです)。

最後に、で構築する場合_EXCEPTION_INLINEのメンバー関数を作成するために使用されます。class exception inline/clr:pure

つまり、ライブラリをサポートする予定がない限り__CLR_OR_THIS_CALLorを使用しないでください。また、実装で使用するべきではありませんが、独自に作成し、独自の制御下にあるものに似たものを使用する必要があります。_EXCEPTION_INLINE/clr_CRTIMP_PURE

于 2012-03-10T05:49:18.797 に答える
1

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

と フレンドのインターフェイスを複製することに問題はありませんstd::exception。インスピレーションを得るために Visual Studio の実装を見ることができます。ただし、実装では、公開されている言語/ライブラリ機能のみを使用する必要があります。

于 2012-03-10T05:49:59.450 に答える