簡體   English   中英

將指針強制轉換為int和警告?

[英]Casting a pointer to int and a warning?

在使用64位處理器在OSX 10.9.1上構建SageMath 6.1的beta版時,我收到了此警告:

extra.cc:940:30: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]

你能給出一個可能導致這種警告的命令的例子嗎?

這里的帖子說沒有辦法做到這一點:

void *ptr = ...;
int x = (int)ptr;
...
ptr = (void *)x;

根據來源無效。

Gcc版

$ gcc --version
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix

鏈接是正確的。 問題是int和指針都沒有標准大小,但在32位系統上它們最有可能都是32位,而在64位系統上,指針是64位寬,而int仍然可能是32位。

你能給出一個可能導致這種警告的命令的例子嗎?

在使用glibc的64位系統上,取一個int並將其值轉換為指針:

int x;
void *p = (void*)x;   

當然,如果問題是指針的大小是整數的兩倍,這一切本身都不是問題,它只是拋出一個警告。 這種事情應該引發警告的原因是它可能在“不是全部”的情況下表明一個嚴重的錯誤。

所以,這不是一個好的編程實踐,但它不必指出一個真正的錯誤 - 例如, p += (void*)x將做同樣的事情,這顯然是無害的,雖然演員是不必要的(並導致警告)。

在編譯甚至廣泛使用的老化軟件時,我注意到各種(希望)無辜的警告。 你只需要相信那些把它放在一起的人都知道這一點並且不分階段,因為他們確信沒有真正的問題,只是一個虛假的警告。 他們幾乎可以肯定地消除它們,但GCC是出了名的挑剔( suggest YET MORE parentheses... ),並不是每個人都在乎,特別是在可能更常在其他地方建造的便攜式項目上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM