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为本机非托管类型呢?