這個(gè)問題是偶爾在一個(gè)論壇中看到的,首先說一下這個(gè)問題的含義:
題目中所說的是定義而不是聲明,也就不可能是extern的聲明方式了,定義的話會(huì)有內(nèi)存分配,如果這個(gè)頭文件包含在多個(gè).c文件中則涉及到重復(fù)定義,這樣生成的obj文件中可能會(huì)有多個(gè)該全局變量的拷貝,這樣連接的話可能報(bào)錯(cuò)。
這里沒有說是不是static的全局變量,所以我們假設(shè)不是(如果可以static的話這個(gè)問題就沒有意義了)。
按我的理解是不可以,聲明和定義是兩碼事,按慣例, 變量和函數(shù)的定義都應(yīng)該在.c文件中而不是.h文件中。但是這個(gè)問題只是問可不可以,網(wǎng)上很多人說可以,理由亂七八糟,有人說可以用宏來解決重復(fù)定義的問題,這個(gè)我就不懂了,宏是預(yù)編譯指令,怎么解決連接時(shí)的錯(cuò)誤呢?還有的人說只要不要再.h文件中給全局變量賦初值就可以,這個(gè)我也無法理解(他說在linux下gcc通過,所以我暫時(shí)無法嘗試),請(qǐng)高手予以解答。
收藏分享WHB_HD阿波
九度論壇管理員UID
1480
帖子
403
積分
1372
九度威望
221
九度貢獻(xiàn)
728
目前職業(yè)
學(xué)生
就職企業(yè)
浙江大學(xué)
最后登錄
2011-5-21
2樓 發(fā)表于 2011-3-3 13:19 |
只看該作者 我的理解和樓主類似。
1. 一般.h文件中是不定義的,只有聲明,理由就是每個(gè).c文件都會(huì)生成一個(gè).obj文件,如果.h文件中有定義,那么就會(huì)有多個(gè)obj文件中有重復(fù)定義,最后鏈接的時(shí)候會(huì)出錯(cuò)。
比如://head.h
extern int g_var;/*說明g_var這個(gè)變量可能在別的編譯單元內(nèi)*/
//source1.c
#include "head.h"
int g_var; /*通過頭文件得知g_var可能在別的編譯單元內(nèi),但是這里有int g_var,那么g_var的定義就在本單元*/
//main.c
#include "head.h"
可以加extern int g_var,也可以不加
/*通過頭文件得知g_var可能在別的編譯單元內(nèi),編譯時(shí)保留一個(gè)符號(hào),鏈接的時(shí)候在其它單元內(nèi)尋找*/
復(fù)制代碼
500 字節(jié)以內(nèi)
不支持自定義 Discuz! 代碼
TOPWHB_HD阿波
九度論壇管理員UID
1480
帖子
403
積分
1372
九度威望
221
九度貢獻(xiàn)
728
目前職業(yè)
學(xué)生
就職企業(yè)
浙江大學(xué)
最后登錄
2011-5-21
3樓 發(fā)表于 2011-3-3 13:45 |
只看該作者 2. 我試了一下在gcc下,樓主說的情況可以編譯,為什么我也不知道。
PS:這題的答案是可以,也可以是不可以,說出自己的理由即可。網(wǎng)上還有人說可以鉆空子,用#ifdef來定義,當(dāng)然,.c中也要相應(yīng)的配合
500 字節(jié)以內(nèi)
不支持自定義 Discuz! 代碼
TOP無為無為
九度論壇超級(jí)版主UID
16543
帖子
827
積分
1732
九度威望
305
九度貢獻(xiàn)
708
目前職業(yè)
學(xué)生
就職企業(yè)
浙江大學(xué)
最后登錄
2011-5-22
4樓 發(fā)表于 2011-3-3 14:55 |
只看該作者 本帖最后由 無為 于 2011-3-3 16:10 編輯
問題一:關(guān)于宏這個(gè)的確是可以解決重復(fù)定義問題,下面這段代碼就可以避免一些變量被重復(fù)定義。
#ifndef MAX
#define MAX
..../*定義一些你要定義的變量*/
#endif
復(fù)制代碼
問題二:在.h文件中定義全局變量但不初始化,這樣可以編譯通過,那是因?yàn)闆]有初始化的全局變量是弱符號(hào),初始化后是強(qiáng)符號(hào)
不過一般不推薦在.h文件中定義變量!
上善若水
TOP無為無為
九度論壇超級(jí)版主UID
16543
帖子
827
積分
1732
九度威望
305
九度貢獻(xiàn)
708
目前職業(yè)
學(xué)生
就職企業(yè)
浙江大學(xué)
最后登錄
2011-5-22
5樓 發(fā)表于 2011-3-3 16:10 |
只看該作者 在程序員的自我修養(yǎng)P92頁有,關(guān)于強(qiáng)符號(hào)和弱符號(hào)
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)
點(diǎn)擊舉報(bào)。