一般に、/ clrスイッチを使用してcl.exeによってコードがコンパイルされると、CLRによって実行されるようにMSILにコンパイルされます。ただし、#pragma unmanaged
ディレクティブを使用して、ネイティブコードを含む混合モードアセンブリを作成することは完全に可能です。C++/CLIで現在のコンパイルターゲットを特定する方法は?
私は、CLRのためにコンパイルされたときとネイティブプラットフォーム用にコンパイルされたときに少し違った振る舞いをしたいと思っています。私はthis pageの定義済みのプリプロセッサマクロをチェックしましたが、悲しいことに、現在のビットがMSILまたはネイティブアーキテクチャ用にコンパイルされているかどうかを、その使用方法のポイントで知ることができませんでした。私が欲しいもの、基本的には、現在のコンパイル対象に基づいて正しく動作する
#if defined(IS_THIS_MANAGED_NOW)
#define THROW throw gcnew System::Exception("Fancy managed exception");
#else
#define THROW throw "Not-so-fancy native string";
#endif
または
#if defined(IS_THIS_MANAGED_NOW)
#define BSR(value, result) result = BitScanReverseManagedImpl(value)
#else
#define BSR(value, result) _BitScanReverse(&result, value);
#endif
です。 (これらは、コードサンプルを生きる、問題はない説明するための例だけだったのでご注意ください)
編集:
次のプログラム
void print(void);
int main(int argc, char *argv[])
{
print();
return 0;
}
#pragma unmanaged
#include <cstdio>
void print()
{
std::printf("__CLR_VER = %d\n", __CLR_VER);
std::printf("__cplusplus_cli = %d\n", __cplusplus_cli);
std::printf("_MANAGED = %d\n", _MANAGED);
}
/で使用する場合は、これらの#define
sが有効に存続することを実証します関数がネイティブターゲット用にコンパイルされている場合でも。
/clrが有効であることを示すプリプロセッサ記号が表示されます。 #pragmaで前後に切り替えると、追跡するのはあなた次第です。これは問題ではないかというと、#pragmaは決して遠く離れず、空から落ちることはありません。ソースコードファイル間でコードを分割する方法も明白ですが、/ clrオプションは各ソースコードファイルに個別に適用されます。 –
定義されたものを避けてください。 BSRサンプルでは、特定のタイプを使用する関数を簡単に使用できます。 – xMRi