1.全域性變數
眾所周知,全域性變數應該是得到記憶體分配且可以被其他模組通過c語言中extern關鍵字呼叫的變數。因此,必須在 .c和 .h 檔案中定義。這種重複的定義很容易導致錯誤。以下討論的方法只需用在標頭檔案中定義一次。雖然有點不易懂,但一旦掌握,使用起來卻很靈活。如下定義出現在定義所有全域性變數的.h標頭檔案中。
#ifdef ***_globals
#define ***_ext
#else
#define ***_ext extern
#endif
.**件中每個全域性變數都加上了***_ext的字首。***代表模組的名字。該模組的.c檔案中有以下定義:
#define ***_globals
#include "includes.h"
當編譯器處理.c檔案時,它強制***_ext(在相應.**件中可以找到)為空,(因為***_globals已經定義)。所以編譯器給每個全域性變數分配記憶體空間,而當編譯器處理其他.c檔案時,***_global沒有定義,***_ext被定義為extern,這樣使用者就可以呼叫外部全域性變數。為了說明這個概念,可以參見ucos_ii.h,其中包括以下定義:
#ifdef os_globals
#define os_ext
#else
#define os_ext extern
#endif
os_ext int32u osidlectr;
os_ext int32u osidlectrrun;
os_ext int32u osidlectrmax;
同時,ucos_ii.c有中以下定義:
#define os_globals
#include 「includes.h」
當編譯器處理ucos_ii.c時,它使得標頭檔案變成如下所示,因為os_ext被設定為空。
int32u osidlectr;
int32u osidlectrrun;
int32u osidlectrmax;
這樣編譯器就會將這些全域性變數分配在記憶體中。當編譯器處理其他.c檔案時,標頭檔案變成了如下的樣子,因為os_global沒有定義,所以os_ext被定義為extern。
extern int32u osidlectr;
extern int32u osidlectrrun;
extern int32u osidlectrmax;
在這種情況下,不產生記憶體分配,而任何 .c檔案都可以使用這些變數。這樣就只需在 .h 檔案中定義一次就可以了。 關於變數的宣告和定義
變數的宣告與定義的區別 變數的宣告有兩種情況 1 一種是需要建立儲存空間的。例如 int a 在宣告的時候就已經建立了儲存空間。2 另一種是不需要建立儲存空間的。例如 extern int a 其中變數a是在別的檔案中定義的。前者是 定義性宣告 defining declaration 或者稱為 定...
關於變數定義的古怪bug
今天除錯了乙份以前寫的code,用的c。問題相當之古怪,最後的結果也令人驚訝。簡單來說,兩個部分,乙個檔案解析,乙個具體動作。檔案解析把結果打包交給動作部分執行。從功能上講,檔案解析出來的內容對於動作模組是黑盒,也就是無論解析出來的內容是什麼,對還是錯,對於動作模組是沒有影響的。校驗適量乙個部分做的...
關於STM32的變數定義
關於stm32的變數定義 分類 嵌入式系統 2014 10 15 19 03 983人閱讀 收藏 舉報 今天除錯程式時,想觀察一下變數的情況,突然發現平時經常移植別人程式時最容易忽略的乙個致命問題,那就是忽略變數型別,這裡有必要給大家一定知識啦,都是庫裡面的,非原創!3.0以後的版本中使用了cmsi...