从所谓的相同尺寸类型进行投射时发出警告

时间:2011-05-02 13:09:28

标签: c casting

我无法想出这个警告。它说我将MY_KEY投射到更大尺寸的HKEY,但它们看起来大小相同(32位)?

//test.c
//compile as C
//compile with warning level 4

#include <windows.h>

typedef enum MY_KEY
{
    //from WinReg.h :
    //#define HKEY_CLASSES_ROOT ((HKEY)(ULONG_PTR)((LONG)0x80000000))

    //ULONG_PTR cast to avoid 'constant expression is not integral' error
    //(caused by HKEY being a HANDLE, and so a void*)
    MY_KEY_1 = (ULONG_PTR)HKEY_CLASSES_ROOT,
} MY_KEY;

void Func1(HKEY b)
{
    b;
}

void Func2(MY_KEY a)
{
    //produces warning C4306:
    //'type cast' : conversion from 'MY_KEY' to 'HKEY' of greater size
    Func1((HKEY)a);
}

(C代码,VS2005,警告级别4。)

1 个答案:

答案 0 :(得分:0)

问题是MY_KEY是HKEY的ULONG_PTR。当你将它传递给函数1时,你将它输入到实际的HKEY,这是一个坏主意。如果您想要HKEY,为什么不直接使用HKEY?除非由于某种原因需要指针,否则在该情况下,传递指针所指向的数据。