3

私の場合、コア層とアプリケーション層という 2 つの層があります。アプリケーション層はコア層に依存します。

コア層だけが CRT 関数を使用するようにしたい。

アプリケーション層では、CRT 関数が使用されている場合、コンパイルしないでください。

これを達成する方法はありますか?たとえば、free/malloc への直接呼び出しは、アプリケーション層で行うべきではありません。

アプリケーション層が直接 CRT 呼び出しを使用できないように、すべての CRT 関数を何らかのエラーに #define することを考えた 1 つの方法 (アプリケーション層にはコア層のヘッダー ファイルが含まれています)。

4

2 に答える 2

1

すべてのプロジェクトがネイティブ C または C++ であると仮定すると、Windows CRT バイナリへの参照を削除するだけで十分だと思います。誰かがそれらを使用しようとすると、リンク エラーが発生します。

dll の場合は、(Visual Studio から) プロジェクト プロパティを開き、に移動してConfiguration Properties->Linker->Inputに設定Ignore All Default LibrariesYes (/NODEFAULTLIB)ます。そのすぐ上で、必要なソリューションのライブラリのみに設定Additional Dependenciesします。

静的ライブラリの場合は、に移動しLibrarian->Generalて同じことを行います。

于 2012-11-09T12:57:03.333 に答える
1

CRT のすべての関数を #define する必要はありません。ヘッダーで宣言された func の 1 つを定義して、コンパイルの失敗を引き起こすだけで十分です。

また、CRT ヘッダーを調べてください。それらのほとんどは、この種の構造に依存しています。

    #ifndef "some unique id"
    #define "some unique id"
    /* header body */
    #endif

この一意の ID を定義すると、実質的にヘッダーがインクルードされなくなり、このヘッダーで宣言された関数を使用しようとするとコンパイル エラーが発生します。

于 2012-11-09T12:52:11.453 に答える