native/cli c++混合使用下 typedef enum class的使用问题

vs2013 新建项目 使用公共语言运行时支持(/clr)
1.编写代码

enum class Enum_Test
{
    A,
    B,
    C
};
typedef enum class Enum_Test ET;
void Function_Enum(Enum_Test en){}
int main()
{
    Function_Enum(Enum_Test::A);
    return 0;
}

编译成功

2.编写代码 在顶部增加 #pragma managed(push,off)

#pragma managed(push,off)
enum class Enum_Test
{
    A,
    B,
    C
};
typedef enum class Enum_Test ET;
void Function_Enum(Enum_Test en){}
int main()
{
    Function_Enum(Enum_Test::A);
    return 0;
}

编译失败
错误 3 error C3821: “void Function_Enum(Enum_Test)”: 托管类型或托管函数不能用于非托管函数

3.编写代码在 Function_Enum定义前增加 #pragma managed(pop)

#pragma managed(push,off)
enum class Enum_Test
{
    A,
    B,
    C
};
typedef enum class Enum_Test ET;
#pragma managed(pop)
void Function_Enum(Enum_Test en){}
int main()
{
    Function_Enum(Enum_Test::A);
    return 0;
}

编译成功

分析

一开始 c++只支持enum 后来有了enum class 和 enum struct,c++/cli同样支持enum class(C++/CX 和 C++/CLI 支持 public enum class**** 和 private enum class****,它们与标准 C++ enum class**** 类似,不同之处在于增加了可访问性说明符。 在 /clr**** 下,允许使用 C++11 enum class**** 类型,但会生成警告 C4472,这是为了确保你确认自己确实需要使用 ISO 枚举类型,而不是 C++/CX 和 C++/CLI 类型。)详见microsoft说明

typedef enum class 在项目和cpp文件使用公共语言运行时支持(/clr)的情况下会被编译成托管类型,但是#pragma managed(push,off)导致Function_Enum编译成非托管函数,该函数使用托管类型产生上述编译错误。

我们一般会在头文件中使用#pragma managed来控制头文件中定义的(内联)函数编译,但是要记得成对使用,#pragma managed(push,off) #pragma managed(pop); 否则引用多个头文件的情况下,很有可能就会产生该问题,我也花了挺长时间才定位问题。

以上个人拙见,仅供参考,欢迎批评指正。
怎么才能设置上述代码中的枚举类Enum_Test为本机非托管类型呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值