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

評論