我有一個項目,其中包括一些性能敏感的本機C++頭,大量使用模板。對於這個項目,我們還封裝了頭文件並添加了一些粘合代碼以將功能展示給c#和其他.NET語言。我們將這個頭文件稱爲「layout.h」,並且我們假設它是我無法更改的第三方頭文件。有沒有辦法檢測在C++/CLI中是否有效#pragma unmanaged?
在混合模式的C++/CLI程序集中,從代碼中的#pragma unmanaged(或#pramga managed(push,off))中出錯幷包含#include相對比較容易。當發生這種情況時,模板會生成IL,並且在運行代碼時會得到額外的託管/非託管轉換,性能會下降。
我的問題是我是否有辦法在#include之前執行編譯時檢查,以便編譯失敗,如果我意外#包含錯誤的上下文。
// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr
ASSERT_UNMANAGED()
#include <layout.h>
我天真的嘗試第一次檢查的#ifdef _MANAGED,但總是被定義我無論是在代碼或不對應的#pragma非託管塊是。
+1:有趣的問題。 – leppie
這是一個非常艱難的。我可以想到十幾種不同的方式來實現'ASSERT_MANAGED',但'ASSERT_UNMANAGED'讓我難住了。 – ildjarn
爲了防止有人查找,_MANAGED,__CLR_VER和__cplusplus_cli不受#pragma managed/#pragma ummanaged的影響,那麼範圍就是整個編譯單元。 –