頭文件里面能不能定義變量?
最近在編譯一個(gè)工程的時(shí)候,突然遇到了變量重復(fù)定義的問(wèn)題,根據(jù)提示打開(kāi)這幾個(gè) C 文件,并沒(méi)有發(fā)現(xiàn)定義變量的地方。后來(lái)再找一找,原來(lái)變量定義在了頭文件里面。
結(jié)論就是,頭文件里面可以定義變量,但是最好不要定義。
寫(xiě)個(gè) demo 看一下。頭文件里面定義變量 num,1.c包含頭文件,并且輸出 num 的值。2.c也包含頭文件,同樣也輸出 num 的值。代碼結(jié)構(gòu)很簡(jiǎn)單。
再寫(xiě)個(gè) Makefile,方便看到編譯的步驟。
執(zhí)行 make 的時(shí)候,從 1.c 變成 1.o 沒(méi)有問(wèn)題,2.c 變成 2.o 也沒(méi)有問(wèn)題,但是最后一步鏈接的時(shí)候,提示 num 重復(fù)定義。
為什么會(huì)這樣。我們知道編譯的第一步是預(yù)處理,所有的頭文件都會(huì)被展開(kāi),比如 1.c ,預(yù)處理后變成了這樣,num 的定義直接被搬到了 C 文件里面。同理,2.c 被預(yù)處理后,里面也多了個(gè) num 的定義。所以最后一步鏈接的時(shí)候,編譯器就提示 num 重復(fù)定義。
解決這個(gè)問(wèn)題方法有很多,比如定義 num 的時(shí)候,加上 static,限制它的作用域,或者干脆不要在頭文件里面定義變量,把它放到源文件中,如果其他文件需要訪問(wèn),用 extern 聲明一下。
頭文件里面定義變量也跟編譯器有關(guān),同樣的代碼,換個(gè)編譯器,鏈接的時(shí)候竟然沒(méi)有問(wèn)題。最后,還是建議大家,最好不要在頭文件里面定義變量和函數(shù)。
審核編輯:劉清
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。
舉報(bào)投訴
原文標(biāo)題:頭文件能不能定義變量?
文章出處:【微信號(hào):學(xué)益得智能硬件,微信公眾號(hào):學(xué)益得智能硬件】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
相關(guān)推薦
C語(yǔ)言中,結(jié)構(gòu)體能不能相加?
發(fā)表于 12-19 17:04
?1268次閱讀
PIC單片機(jī)能不能把IO口定義成一個(gè)變量,比如我要位操作RA0口,我在程序中用一個(gè)變量X來(lái)代替RA0,接下來(lái)程序中我只要修改X的值就能改變RA0口的輸出狀態(tài).我用的是PICC編義器,我
發(fā)表于 02-01 17:49
各位大神好,請(qǐng)問(wèn)用labview能不能實(shí)現(xiàn)這樣一種功能,在前面板中的按鈕控制某一VI的運(yùn)行,這一個(gè)VI的運(yùn)行結(jié)果又返回到主VI,不知道用共享變量能不能實(shí)現(xiàn)。描述的不夠清楚,勿怪,謝謝。
發(fā)表于 12-30 09:52
急求atmega128可定義變量類(lèi)型,主要是看能不能定義32位的變量
發(fā)表于 05-17 10:46
最近在做一個(gè)數(shù)字電源,需要用到PID控制輸出電壓的穩(wěn)定。請(qǐng)問(wèn)哪一個(gè)型號(hào)的DSP的C∕C++ 頭文件和外設(shè)示例有PID控制程序?謝謝了。我在28XX系列的例程里面沒(méi)有找到PID的例程。要是沒(méi)有,能不能上傳一份例程
發(fā)表于 05-14 04:46
教大家一個(gè)如何在頭文件中定義全局變量的方法 通常情況下,都是在C文件中定義全局變量,在
發(fā)表于 07-04 08:34
教大家一個(gè)如何在頭文件中定義全局變量的方法 通常情況下,都是在C文件中定義全局變量,在
發(fā)表于 07-09 09:25
電池能不能修復(fù)?
電池修復(fù)作為一個(gè)新生事物,許多人對(duì)它不了解,也有許多人對(duì)它一知半解。那么電池到底能不能修復(fù)呢?
發(fā)表于 11-23 10:40
?1094次閱讀
通常情況下,都是在C文件中定義全局變量,在頭文件中聲明,但是,如果我們定義的全局變量需要被很多的
發(fā)表于 12-04 14:55
?19次下載
諧波治理到底能不能節(jié)電?”這是我們做電能質(zhì)量行業(yè)經(jīng)常會(huì)被問(wèn)到的一個(gè)問(wèn)題。隨著國(guó)家對(duì)節(jié)能減排項(xiàng)目的大力支持,有不少商業(yè)人士一擁而上加入到節(jié)能行業(yè),想要分得節(jié)能市場(chǎng)的一杯羹。那么,通過(guò)諧波治理到底能不能實(shí)現(xiàn)節(jié)能的效果呢?
發(fā)表于 04-23 15:50
?3551次閱讀
頭文件中一般放一些重復(fù)使用的代碼,如:常量、變量、宏等的定義,函數(shù)的聲明。當(dāng)使用#include語(yǔ)句引用頭頭文件時(shí),相當(dāng)于將頭文件中的內(nèi)容復(fù)
發(fā)表于 12-05 10:36
?5次下載
大型輥壓機(jī)軸磨損能不能現(xiàn)場(chǎng)維修?
發(fā)表于 06-23 15:35
?1次下載
指針能不能作為循環(huán)變量?
發(fā)表于 02-16 18:11
?1030次閱讀
物聯(lián)網(wǎng)流量卡到底能不能用?
發(fā)表于 08-28 09:40
?6306次閱讀
C語(yǔ)言中的頭文件能不能重復(fù)包含? 比如代碼寫(xiě)成這樣,stdio.h 連續(xù)包含了兩次。 #include #include int main(){ printf("helloworld
發(fā)表于 11-26 17:19
?150次閱讀
評(píng)論