頭文件里面能不能定義變量?
最近在編譯一個(gè)工程的時(shí)候,突然遇到了變量重復(fù)定義的問題,根據(jù)提示打開這幾個(gè) C 文件,并沒有發(fā)現(xiàn)定義變量的地方。后來(lái)再找一找,原來(lái)變量定義在了頭文件里面。
結(jié)論就是,頭文件里面可以定義變量,但是最好不要定義。
寫個(gè) demo 看一下。頭文件里面定義變量 num,1.c包含頭文件,并且輸出 num 的值。2.c也包含頭文件,同樣也輸出 num 的值。代碼結(jié)構(gòu)很簡(jiǎn)單。
再寫個(gè) Makefile,方便看到編譯的步驟。
執(zhí)行 make 的時(shí)候,從 1.c 變成 1.o 沒有問題,2.c 變成 2.o 也沒有問題,但是最后一步鏈接的時(shí)候,提示 num 重復(fù)定義。
為什么會(huì)這樣。我們知道編譯的第一步是預(yù)處理,所有的頭文件都會(huì)被展開,比如 1.c ,預(yù)處理后變成了這樣,num 的定義直接被搬到了 C 文件里面。同理,2.c 被預(yù)處理后,里面也多了個(gè) num 的定義。所以最后一步鏈接的時(shí)候,編譯器就提示 num 重復(fù)定義。
解決這個(gè)問題方法有很多,比如定義 num 的時(shí)候,加上 static,限制它的作用域,或者干脆不要在頭文件里面定義變量,把它放到源文件中,如果其他文件需要訪問,用 extern 聲明一下。
頭文件里面定義變量也跟編譯器有關(guān),同樣的代碼,換個(gè)編譯器,鏈接的時(shí)候竟然沒有問題。最后,還是建議大家,最好不要在頭文件里面定義變量和函數(shù)。
審核編輯:劉清
-
變量
+關(guān)注
關(guān)注
0文章
614瀏覽量
28759 -
頭文件
+關(guān)注
關(guān)注
0文章
26瀏覽量
10012
原文標(biāo)題:頭文件能不能定義變量?
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
PIC單片機(jī)能不能把IO口定義成一個(gè)變量
共享變量能不能實(shí)現(xiàn)這種功能呢
請(qǐng)問哪個(gè)系列的DSP的 C∕C++ 頭文件和外設(shè)示例有PID控制的例程呢?
電池能不能修復(fù)?
教大家一個(gè)如何在頭文件中定義全局變量的方法
諧波治理到底能不能節(jié)電
MCU_頭文件編寫

評(píng)論