大家好,我是電源漫談,很高興和各位一起分享我的第59篇原創(chuàng)文章,喜歡和支持我的工程師,一定記得給我點贊、收藏、分享。
在C程序的書寫中,往往會分為多個子文件,所以同一個變量不免會在多個C源程序文件中去訪問使用,本文就這一基礎問題做一些梳理。
如何在不同C文件使用同一個變量?
當你在一個C的源文件中定義了一個變量(而不是在頭文件中定義變量),如果你想在另一個C源文件中去使用這個變量,那么此時你就可以使用extern來申明。
一般來說,比較推薦的方式是,定義一個頭文件,來放置所有的相關(guān)申明,在任何一個想訪問這個變量的C源文件中去包含這個頭文件。
這里我們需要重點澄清兩個定義,一個是變量定義,它是指編譯器安排空間存儲這個變量。另一個是變量申明,它是指讓編譯器知道其數(shù)據(jù)類型及它的存在,但是并不會定義它的存儲空間。
實際示例說明
這里我們來舉一個示例,我們定義一個易失變量volatile int start,需要在程序中任何一個位置可以訪問它,因此,我們在main.c中去定義這個變量,如圖1所示。
圖1 變量的定義示例
如前所述,我們創(chuàng)建一個頭文件,在這個頭文件中去做這個變量start的申明,這里需要注意,在申明時需要包含所有定義時的限定符,這時就可以在任何想使用這個變量的C源文件中,通過包含頭文件來使用這個變量了,如圖2,3所示。
圖2 在其它C文件中使用變量
如何避免重復定義和申明?
圖3 在頭文件中進行變量申明
當我們在頭文件中,申明變量時,為了避免不同C源文件使用同一個變量時,編譯器會重復定義這個變量,我們需要使用如圖3所示的guard條件。
圖4 在變量原始定義C文件中引用申明頭文件
一般的,建議在定義這個變量的C源文件中也要增加這個頭文件申明,這樣做的好處是讓C文件中的變量定義重新檢查,看看它是否和頭文件中的申明一致,如果不一致,編譯器會給出警告,用戶就會處理。
簡要總結(jié)
不建議在頭文件中定義變量,因為當C文件進行編譯時,會將它用到的頭文件原樣放置在C文件中,如果對于一個文件用到這個變量時,就會出現(xiàn)重復的變量定義錯誤。所以,一般建議在C源文件中定義變量,但是在頭文件中用extern進行變量申明。
這里需要注意的是,對于宏定義和結(jié)構(gòu)體或者聯(lián)合體等類型,可以在頭文件中定義,因為他們只是存在于編譯階段,不會涉及到文件鏈接。