2017-08-24 12 views
0

一般に、/ 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が有効に存続することを実証します関数がネイティブターゲット用にコンパイルされている場合でも。

+0

/clrが有効であることを示すプリプロセッサ記号が表示されます。 #pragmaで前後に切り替えると、追跡するのはあなた次第です。これは問題ではないかというと、#pragmaは決して遠く離れず、空から落ちることはありません。ソースコードファイル間でコードを分割する方法も明白ですが、/ clrオプションは各ソースコードファイルに個別に適用されます。 –

+0

定義されたものを避けてください。 BSRサンプルでは、​​特定のタイプを使用する関数を簡単に使用できます。 – xMRi

答えて

0

#pragmaディレクティブに基づいて#ifdefを持つことはできません。 #ifdefは、コンパイラが後の段階で#pragma命令を処理する前の、コンパイルの前処理段階で処理されます。

最も近いのは#ifdef __cplusplusです。これにより、#pragmaではなく、ファイルのコンパイル方法(/clrフラグの有無にかかわらず)が切り替わります。プロジェクトの設定方法によっては、ファイル単位で設定を変更できるため、細かい設定が可能です。

#ifdef __cplusplus_cli 
#define THROW throw gcnew System::Exception("Fancy managed exception"); 
#else 
#define THROW throw "Not-so-fancy native string"; 
#endif 
+0

__cplusplus_cliは#pragma unmanaged指令の後でさえ有効です(定義済み)ので、これは疑問に答えるようです。 –

+0

'#ifdef'に#pragma managed/unmanagedの結果を反映させたいなら、それは可能だとは思いません。 '#ifdef'はプリプロセッサステップで処理され、' #pragma unmanaged'はコード生成ステップです。あなたのコードで '#pragma managed'と' #pragma unmanaged'を使用している場合、なぜ#define IS_THIS_MANAGED_NOWと#undef IS_THIS_MANAGED_NOWは同時にできませんか? –

+0

コードは "ライブラリ"として使用することを意図しているため、現在のモードの検出とコードベースの共有が望ましいでしょう。 申し訳ありませんが、これは可能ではありません。しかし、まったく予想外ではない。 –