我在.H如何讓gcc警告未定義的結構?
struct buf_stats {
// ***
};
限定的結構然後在.c文件
struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;
其中buf_states
是一個錯字。
但GCC不提醒我,雖然我以前-Wall
和這個bug /錯字我花了3個小時找到。
如何使gcc警告未定義的結構像這樣?
我在.H如何讓gcc警告未定義的結構?
struct buf_stats {
// ***
};
限定的結構然後在.c文件
struct buf_stats *bs = malloc(sizeof(struct buf_states*)) ;
其中buf_states
是一個錯字。
但GCC不提醒我,雖然我以前-Wall
和這個bug /錯字我花了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
的類型後無需進行任何修改。可能值得一提的是'sizeof * bs'中的'*'不*表示一個指針,而是一個取消引用。 'bs'是一個指針,所以'* bs'是結構體本身的值,在這裏調用sizeof。 – tomsmeding
此外,註釋1還是不錯的,因爲如果'struct but_stats'沒有完成,或者'bs'是類型名稱而不是變量名稱,它實際上會產生類似於@Sato要求的錯誤。 – Leushenko
我見過指向不同尺寸的東西的指針是不同大小的平臺。 (void *是指向任何數據類型的最大指針,以使其工作。) – Joshua
你不能。使用類似struct foo *
(指向某種結構類型的指針)的表達式聲明該結構爲不完整類型。尺寸未知,但對於指針的尺寸沒有必要。
這就是說,代碼看起來錯誤的,因爲你需要的大小結構的(不指針的大小),所以用下面的代碼:
struct buf_stats *bs = malloc(sizeof(struct buf_states));
,你會得到一個錯誤。
有寫這樣的代碼有更好的方式:
struct buf_stats *bs = malloc(sizeof *bs);
表達*bs
具有正確的類型sizeof
,即使您以後更改類型。
嘿?你得到的錯誤信息是什麼? –
@SouravGhosh我認爲沒有錯誤信息,這是OP詢問的。 – Yunnosch
竇想給malloc足夠的空間作爲指針嗎?編譯器並不真正需要它指向的大小。或者你想malloc的結構?在這種情況下,還有另一個錯字,第二個「*」。 – Yunnosch