[英]How to make gcc warn undefined struct?
我在.h中定義了一個結構
struct buf_stats {
// ***
};
然后在.c文件中
struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;
其中buf_states
是一個錯字。
但是gcc並沒有警告我,盡管我曾經使用-Wall
而這個錯誤/錯別字使我花了3個小時來找出答案。
如何使gcc這樣警告未定義的結構?
在你的代碼中
struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;
有很多原因是錯誤的,例如
但是對於這種特定類型的錯誤,您的編譯器在_this_case中無濟於事,因為
平台中的( 任意 )類型的指針具有定義的大小,因為該結構(即其指向的變量的類型)不需要完整( 定義 )。 這就是我們可以擁有自引用結構的原因,對嗎?
malloc()
對目標變量類型一無所知。 它只是讀取所需大小的參數,將指針(類型為void *
)返回到分配的內存,並在分配后將其更改為目標類型。 它可能無法計算目標大小(類型)與分配的內存大小的不匹配 。
避免這些類型錯誤的最方便,最簡單的方法是,不要直接將硬編碼類型用作sizeof
的操作數,而應使用變量引用。
就像是
struct buf_stats *bs = malloc(sizeof *bs) ; // you can write that as (sizeof (*bs)) also
// sizeof *bs === sizeof (struct buf_stats)
相當於
struct buf_stats *bs = malloc(sizeof(struct buf_stats)) ;
但更健壯,更不易出錯。
筆記:
bs
的類型時,此語句不需要任何修改。 你不能 使用類似struct foo *
的表達式(指向某種struct類型的指針)可將該struct 聲明為不完整的類型 。 大小未知,但是指針的大小不是必需的。
也就是說,由於您需要結構的大小( 而不是指針的大小),因此代碼看起來不對,因此使用以下代碼:
struct buf_stats *bs = malloc(sizeof(struct buf_states));
你會得到一個錯誤 。
有一種更好的方式編寫這樣的代碼:
struct buf_stats *bs = malloc(sizeof *bs);
表達式*bs
具有用於sizeof
的正確類型,即使您稍后更改類型也是如此。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.