テンプレートを頻繁に使用する、パフォーマンスに影響を受けやすいネイティブ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管理されていないブロックにいるかどうか、それは常に定義されています。
+1:興味深い質問です。 – leppie
これは本当に厳しいものです。私は 'ASSERT_MANAGED'を実装する方法が12種類あると考えることができますが、' ASSERT_UNMANAGED'は私に困惑しています。 – ildjarn
誰かが何を検索するか、_MANAGED、__CLR_VER、および__cplusplus_cliが#pragma managed/#pragma ummanagedの影響を受けない場合は、スコープがコンパイル単位全体です。 –