2011-08-12 36 views
9

テンプレートを頻繁に使用する、パフォーマンスに影響を受けやすいネイティブC++ヘッダーを含むプロジェクトがあります。このプロジェクトでは、ヘッダーをラップし、いくつかのグルーコードを追加して、C#やその他の.NET言語にその機能を公開します。このヘッダーは "layout.h"と呼ばれ、変更できないサードパーティヘッダーと見なします。#pragma unmanagedがC++/CLIで有効かどうかを検出する方法はありますか?

混在モードのC++/CLIアセンブリでは、#pragma unmanaged(または#pramga managed(push、off))のコード内の場所から間違いを犯して#includeするのは比較的簡単です。それが起こると、テンプレートがILを生成し、コードを実行するときに追加の管理/非管理遷移が発生し、パフォーマンスが低下します。

私の質問は、誤って間違ったコンテキストから#includingしている場合、コンパイルが失敗するように、#includeの直前でコンパイル時のチェックを行う方法があるかどうかです。

// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr 
    ASSERT_UNMANAGED() 
    #include <layout.h> 

私の素朴な第一の試みは_MANAGED #ifdefの確認が、私はコードやないのに#pragma管理されていないブロックにいるかどうか、それは常に定義されています。

+0

+1:興味深い質問です。 – leppie

+0

これは本当に厳しいものです。私は 'ASSERT_MANAGED'を実装する方法が12種類あると考えることができますが、' ASSERT_UNMANAGED'は私に困惑しています。 – ildjarn

+0

誰かが何を検索するか、_MANAGED、__CLR_VER、および__cplusplus_cliが#pragma managed/#pragma ummanagedの影響を受けない場合は、スコープがコンパイル単位全体です。 –

答えて

1

ASSERT_MANAGEDまたはASSERT_UNMANAGEDというコードを使用して、管理対象または非管理対象のコンパイル時にのみ使用できる構成を使用できます。 ref class宣言は、managedを使用する場合にのみ使用可能な例です。

これは幾分汚い解決策ですが、うまくいくはずです。

+1

refクラス宣言-do-は、ASSERT_MANAGED()を書くときに機能します。そのトリックは、ASSERT_UNMANAGED()ブロックの書き込みを有効にするためのC++/CLIの合法でないC++を見つけることです –

+2

もう一つの最も近い競合者は、CLIコード(System :: String)で動作する定数ストリング連結を使用しています。コード。私はまだそれ以上のことを探求しています! – Ajay

+0

私はvoid __fastcall foo()を考えました。実際には動作しません、そこにコンパイラのバグのビット。 –

1

プラグマディレクティブは、インクルードファイルに直接挿入する必要があります。このようにして、管理対象外のセクションが宣言されたファイルをどこにでも含めることができます。

申し訳ありませんが、あなたのインクルードファイルを変更する必要があります。

関連する問題