如何在C ++ / CLI中确定当前的编译目标?

时间:2017-08-24 15:53:27

标签: c++-cli c-preprocessor

通常,当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仍然有效,即使正在为本机目标编译该函数。

1 个答案:

答案 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