2011-05-02 127 views
0

我無法找出這個警告。它說我正在將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

MY_KEY是一個32位有符號整數,所以它們的大小相同但簽名不相同。我不知道VS,所以我不確定這是什麼原因導致問題。 – Lundin 2011-05-02 13:12:23

+0

@倫丁:是的,我認爲你是對的。如果我將最後一行更改爲'Func1((HKEY)(ULONG_PTR)a);'警告消失!我弄錯了,發現如果我把它改成'Func1((HKEY)MY_KEY_1);'這個警告也會消失,但是這並不能幫助我,因爲這個調用需要使用'Func2'的參數。正在使用'Func1((HKEY)(ULONG_PTR)a);'解決這個問題的正確方法呢? – Emelia 2011-05-02 13:19:10

+1

你能放下演員嗎?在'C'中,演員往往是不必要的。使用'Func1(a);'讓編譯器根據函數原型進行轉換。如果編譯器不能隱式地做到這一點,那麼很有可能明確地使用cast來做是不對的。 – pmg 2011-05-02 13:26:01

回答

0

的問題是,MY_KEY是ULONG_PTR到HKEY。當你將它傳遞給函數1時,你將它類型轉換爲實際的HKEY,這是一個壞主意。如果你想要一個HKEY,你爲什麼不直接使用一個HKEY?除非由於某種原因你需要一個指針,在這種情況下,傳遞指針指向的數據。

+0

MY_KEY不是ULONG_PTR,它是** signed int **。 – Lundin 2011-05-02 14:17:32

+0

澄清:Windows記譜法中的HSOMETHING意味着「處理到」,這只是一種說方言的怪異方式。所以在這種情況下,HKEY是一個指向KEY的指針。 – Lundin 2011-05-02 14:25:58