我無法找出這個警告。它說我正在將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)
MY_KEY是一個32位有符號整數,所以它們的大小相同但簽名不相同。我不知道VS,所以我不確定這是什麼原因導致問題。 – Lundin 2011-05-02 13:12:23
@倫丁:是的,我認爲你是對的。如果我將最後一行更改爲'Func1((HKEY)(ULONG_PTR)a);'警告消失!我弄錯了,發現如果我把它改成'Func1((HKEY)MY_KEY_1);'這個警告也會消失,但是這並不能幫助我,因爲這個調用需要使用'Func2'的參數。正在使用'Func1((HKEY)(ULONG_PTR)a);'解決這個問題的正確方法呢? – Emelia 2011-05-02 13:19:10
你能放下演員嗎?在'C'中,演員往往是不必要的。使用'Func1(a);'讓編譯器根據函數原型進行轉換。如果編譯器不能隱式地做到這一點,那麼很有可能明確地使用cast來做是不對的。 – pmg 2011-05-02 13:26:01