[英]What does the C standard say about bitshifting more bits than the width of type?
[英]The following assignment only causes a warning. What does this say about how C treats type equivalence?
以下分配僅導致警告。 關於C如何對待類型等價,這說了什么?
int *iptr;
float *fptr;
float fval;
fval = 0.0;
fptr = &fval;
iptr = fptr;
特別是,我指的是上面代碼片段的最后一行中的賦值; 即,
iptr = fptr;
它更多地說明了你使用的編譯器的行為而不是關於C的行為,盡管C標准允許編譯器的行為(不幸的是恕我直言)。
int*
和float*
類型是不同的,語言定義它們之間沒有隱式轉換。
嘗試在沒有強制轉換的情況下將一個分配給另一個(即顯式類型轉換)是違反約束 ,這意味着需要編譯器發出診斷消息。
C標准不要求這種診斷是致命的。 通過發出警告,就C標准而言,編譯器已完成其工作。 它可以在相同的有效性下拒絕您的程序(在我看來,這將更加用戶友好)。 但這兩種行為都是一致的。
您可以以某種方式調用編譯器,使其將其視為致命錯誤。 例如,如果您正在使用gcc -pedantic-errors
選項(以及指定要使用哪個版本的C標准的選項)應該可以解決問題。
如果你真的想要執行該任務(包含所有需要的風險),你可以使用強制轉換:
iptr = (int*)fptr;
除了(可能)關閉編譯器警告,指針應該投作為你正在做的事情非常棘手的提醒,它可能在你的臉上吹,如果你don'w知道你在做什么 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.