通常,当cl.exe使用/ clr开关编译代码时,它会被编译为MSIL以由CLR运行。但是,完全可以使用#pragma unmanaged
指令创建包含本机代码的混合模式程序集。
我有一些代码行,当我们为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);
}
演示如果与/ clr一起使用,这些#define
仍然有效,即使正在为本机目标编译该函数。
答案 0 :(得分:0)
据我所知,基于#ifdef
指令不可能有#pragma
。 #ifdef
在编译的预处理器阶段处理,这是在编译器在稍后阶段处理#pragma
指令之前。
最接近的是使用#ifdef __cplusplus
。这会切换文件的编译方式(带或不带/clr
标志),而不是#pragma
。根据项目的设置方式,这可能非常精细,因为您可以基于每个文件更改该设置。
#ifdef __cplusplus_cli
#define THROW throw gcnew System::Exception("Fancy managed exception");
#else
#define THROW throw "Not-so-fancy native string";
#endif