我们可以将Enum作为参数传递给Long_PTR吗?

时间:2020-06-12 06:57:01

标签: visual-c++ mfc

我们可以将枚举传递给Long_PTR吗? 下面是示例,我没有看到将枚举传递给LONG_PTR的任何问题,但这是正确的吗?

enum TestEnum
{
eTestAdd = 7,
eTestMinus = 8
}

TestEnum(7, eTestAdd);

TestEnum(long lEventType, LONG_PTR lEventData)
{
TestEnum eTest = (TestEnum)lEventData;
}

1 个答案:

答案 0 :(得分:0)

问题是关于LONG_PTR的并且标记为MFC,因此以下内容将专门针对Windows和VC ++。有关枚举和整数类型之间的一般转换,请参见原始帖子下的第一条评论。

在VC ++中,TestEnum的大小默认为int,而LONG_PTR是整数类型,其大小与指针的大小匹配,这意味着32b版本中的4个字节和8字节(64b版本)。因此:

    TypeEnumLONG_PTR
  • 转换始终是安全的;

  • LONG_PTRTypeEnum
  • 转换在32b版本中是安全的,但在64b版本中可能会被截断。

例如:

    LONG_PTR lp1 = MAXSSIZE_T;
    TestEnum te = (TestEnum)lp1;
    LONG_PTR lp2 = te;

    std::cout << lp1 << ((lp2 == lp1) ? " == " : " != ") << lp2 << std::endl;

在32b编译中,输出为:

    2147483647 == 2147483647

但是在64b编译中:

    9223372036854775807 != -1

为了使从LONG_PTRTestEnum的反向转换也很安全,TestEnum可以显式声明LONG_PTR作为其基础类型,即enum TestEnum : LONG_PTR