我似乎無法理解GCC編譯器的警告,當我嘗試將void *
值分配給intptr_t
變量時,我會得到警告。具體地,當我與-std=c99 -pedantic
編譯,我得到關於可變z
的第7行的初始化以下警告:是否將void *值設置爲intptr_t變量需要顯式強制轉換?
警告:初始化將指針整數,未作施放[-Wint轉換]
這裏是源代碼:
#include <stdint.h>
int main(void){
unsigned int x = 42;
void *y = &x;
intptr_t z = y; /* warning: initialization makes integer from pointer without a cast [-Wint-conversion] */
return 0;
}
當然,如果我明確投y
到intptr_t
則警告消失。然而,當intptr_t
的整個目的是在void *
值的轉換和處理中時,我混淆了爲什麼會出現隱式轉換的警告。
從部分C99標準的7.18.1.4:
以下類型表示與屬性有符號整數類型,任何有效 指針空隙可以轉化爲這種類型,那麼轉換回指針空隙, ,其結果將比較等於原始指針:
使用intptr_t
上午我誤解的標準,或者是GCC只是在其「從指針整數」過於迂腐在這種情況下檢查?
這是[上一個問題](http://stackoverflow.com/questions/9492798/using-intptr- t-instead-of-void)有關嗎? –
這不是過於迂腐,隱式轉換隻是警告存在的常見錯誤來源,請考慮在涉及重載解決方案時它會如何變成疼痛。知道你在做什麼,通過做一個(希望是C++風格的)轉換來告訴編譯器 – StoryTeller
intptr_t是一個普通的整數類型,唯一的保證是它可以保存一個void *的所有相關信息,它是對於其他整數類型不能保證,所以警告是正確的。爲什麼你想在第一個地方使用整數?通常一個用於低級算術或位操作RESS。然後強烈建議'uintptr_t'。否則,想想三次(!)如果你真的想要一個整數持有一個指針。 – Olaf