【发布时间】:2011-08-12 10:58:40
【问题描述】:
我有一个项目,其中包含一些对性能敏感的本机 C++ 标头,这些标头大量使用模板。对于这个项目,我们还包装了标头并添加了一些胶水代码,以将功能公开给 c# 和其他 .NET 语言。我们将此标头称为“layout.h”,并假设它是我无法更改的第三方标头。
在混合模式的 C++/CLI 程序集中,从代码中 #pragma unmanaged (或 #pragma managed(push,off) ) 的位置出现错误和 #include 相对容易。发生这种情况时,模板会生成 IL,并且在运行代码时我会获得额外的托管/非托管转换,并且性能会下降。
我的问题是是否有一种方法可以在#include 之前进行编译时检查,以便如果我不小心从错误的上下文中#include 编译失败。
// File1.cpp, compiled in a mixed mode C++/CLI assembly with /clr
ASSERT_UNMANAGED()
#include <layout.h>
我天真的第一次尝试检查了#ifdef _MANAGED,但无论我是否在#pragma 非托管代码块中,它总是被定义。
【问题讨论】:
-
这真的很难。我可以想出十几种不同的方法来实现
ASSERT_MANAGED,但ASSERT_UNMANAGED让我很难过。 -
以防万一有人查找什么,_MANAGED、__CLR_VER 和 __cplusplus_cli 不受#pragma managed/#pragma ummanaged 的影响,范围是整个编译单元。
标签: visual-c++ c++-cli