我们可以将枚举传递给Long_PTR吗? 下面是示例,我没有看到将枚举传递给LONG_PTR的任何问题,但这是正确的吗?
enum TestEnum
{
eTestAdd = 7,
eTestMinus = 8
}
TestEnum(7, eTestAdd);
TestEnum(long lEventType, LONG_PTR lEventData)
{
TestEnum eTest = (TestEnum)lEventData;
}
答案 0 :(得分:0)
(问题是关于LONG_PTR
的并且标记为MFC
,因此以下内容将专门针对Windows和VC ++。有关枚举和整数类型之间的一般转换,请参见原始帖子下的第一条评论。)
在VC ++中,TestEnum
的大小默认为int
,而LONG_PTR
是整数类型,其大小与指针的大小匹配,这意味着32b版本中的4
个字节和8
字节(64b版本)。因此:
TypeEnum
到LONG_PTR
的转换始终是安全的;
LONG_PTR
到TypeEnum
的转换在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_PTR
到TestEnum
的反向转换也很安全,TestEnum
可以显式声明LONG_PTR
作为其基础类型,即enum TestEnum : LONG_PTR
。