簡體   English   中英

如何使gcc警告未定義的結構?

[英]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*)) ;

有很多原因是錯誤的,例如

  • 您正在使用未定義的類型(如前所述)
  • 您分配的內存較少(分配給類型指針而不是type

但是對於這種特定類型的錯誤,您的編譯器在_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)) ;

但更健壯,更不易出錯。

筆記:

  1. 如果操作數不是類型名,則不需要括號。
  2. 更改目標變量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.

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