DCL36-C. 不要聲明鏈接類型沖突的標(biāo)識(shí)符

DCL36-C. 不要聲明鏈接類型沖突的標(biāo)識(shí)符

鏈接可以使標(biāo)識(shí)符在不同的作用域中聲明捕虽,或者在同一個(gè)作用域中聲明多次(這些聲明指向同一個(gè)對(duì)象或函數(shù))。標(biāo)識(shí)符可以被分為外部鏈接校赤,內(nèi)部鏈接無鏈接则涯。這三類鏈接具有以下特征 [Kirch-Prinz 2002]:

  • 外部鏈接(External linkage): 一個(gè)具有外部鏈接屬性的標(biāo)識(shí)符在整個(gè)程序中(即所有屬于該程序的編譯單元和庫)都表示同一個(gè)對(duì)象或函數(shù)。鏈接器可以鏈接到該標(biāo)識(shí)符杨刨。當(dāng)另外一個(gè)同樣的標(biāo)識(shí)符被聲明時(shí)晤柄,鏈接器會(huì)將該標(biāo)識(shí)符 指定到同一個(gè)對(duì)象或函數(shù)。

  • 內(nèi)部鏈接(Internal linkage): 一個(gè)具有內(nèi)部鏈接屬性的標(biāo)識(shí)符在指定的翻譯單元中表示通過一個(gè)對(duì)象或函數(shù)妖胀。鏈接器不知道內(nèi)部鏈接屬性標(biāo)識(shí)符的任何信息芥颈。這些標(biāo)識(shí)符只對(duì)翻譯單元內(nèi)部可見。

  • 無鏈接(No linkage): 如果一個(gè)標(biāo)識(shí)符時(shí)無鏈接的赚抡,那么再聲明一個(gè)該標(biāo)識(shí)符都會(huì)聲明一個(gè)新的對(duì)象或類型.

根據(jù)C語言標(biāo)準(zhǔn)爬坑,6.2.2 [ISO/IEC 9899:2011], 鏈接被定義如下:

If the declaration of a file scope identifier for an object or a function contains the storage class specifier static, the identifier has internal linkage.

For an identifier declared with the storage-class specifier extern in a scope in which a prior declaration of that identifier is visible, if the prior declaration specifies internal or external linkage, the linkage of the identifier at the later declaration is the same as the linkage specified at the prior declaration. If no prior declaration is visible, or if the prior declaration specifies no linkage, then the identifier has external linkage.

If the declaration of an identifier for a function has no storage-class specifier, its linkage is determined exactly as if it were declared with the storage-class specifier extern. If the declaration of an identifier for an object has file scope and no storage-class specifier, its linkage is external.

The following identifiers have no linkage: an identifier declared to be anything other than an object or a function; an identifier declared to be a function parameter; a block scope identifier for an object declared without the storage-class specifier extern.

在某個(gè)翻譯單元中使用一個(gè)既是內(nèi)部又是外部鏈接類型的標(biāo)識(shí)符會(huì)導(dǎo)致 未定義行為(參見未定義行為 8)。一個(gè)翻譯單元包含源文件及其頭文件涂臣,以及所有通過預(yù)編譯指令#include包含的源文件盾计。

下面這個(gè)表格標(biāo)識(shí)了在一個(gè)單獨(dú)的翻譯單元中聲明了兩次的對(duì)象的鏈接屬性。列表示第一次聲明赁遗,行表示再次聲明署辉。

DCL36-C_table.png

不遵從規(guī)范的代碼示例

在這個(gè)不遵從規(guī)范的代碼示例中,i2i5被定義為既是內(nèi)部又是外部鏈接屬性岩四。進(jìn)一步使用這兩個(gè)標(biāo)識(shí)符會(huì)導(dǎo)致未定義行為哭尝。


int i1 = 10;         /* Definition, external linkage */
static int i2 = 20;  /* Definition, internal linkage */
extern int i3 = 30;  /* Definition, external linkage */
int i4;              /* Tentative definition, external linkage */
static int i5;       /* Tentative definition, internal linkage */
 
int i1;  /* Valid tentative definition */
int i2;  /* Undefined, linkage disagreement with previous */
int i3;  /* Valid tentative definition */
int i4;  /* Valid tentative definition */
int i5;  /* Undefined, linkage disagreement with previous */
 
int main(void) {
  /* ... */
  return 0;
}

符合規(guī)范的解決方案

這個(gè)符合規(guī)范的方案不包含鏈接類型沖突的定義:

int i1 = 10;         /* Definition, external linkage */
static int i2 = 20;  /* Definition, internal linkage */
extern int i3 = 30;  /* Definition, external linkage */
int i4;              /* Tentative definition, external linkage */
static int i5;       /* Tentative definition, internal linkage */
 
int main(void) {
  /* ... */
  return 0;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市剖煌,隨后出現(xiàn)的幾起案子材鹦,更是在濱河造成了極大的恐慌,老刑警劉巖末捣,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件侠姑,死亡現(xiàn)場離奇詭異,居然都是意外死亡箩做,警方通過查閱死者的電腦和手機(jī)莽红,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來邦邦,“玉大人安吁,你說我怎么就攤上這事∪枷剑” “怎么了鬼店?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長黔龟。 經(jīng)常有香客問我妇智,道長滥玷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任巍棱,我火速辦了婚禮惑畴,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘航徙。我一直安慰自己如贷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布到踏。 她就那樣靜靜地躺著杠袱,像睡著了一般。 火紅的嫁衣襯著肌膚如雪窝稿。 梳的紋絲不亂的頭發(fā)上楣富,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音伴榔,去河邊找鬼菩彬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛潮梯,可吹牛的內(nèi)容都是我干的骗灶。 我是一名探鬼主播,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼秉馏,長吁一口氣:“原來是場噩夢啊……” “哼耙旦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起萝究,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤免都,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后帆竹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绕娘,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年栽连,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了险领。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秒紧,死狀恐怖绢陌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情熔恢,我是刑警寧澤脐湾,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站叙淌,受9級(jí)特大地震影響秤掌,放射性物質(zhì)發(fā)生泄漏愁铺。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一闻鉴、第九天 我趴在偏房一處隱蔽的房頂上張望帜讲。 院中可真熱鬧,春花似錦椒拗、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至玷氏,卻和暖如春堵未,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盏触。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國打工渗蟹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人赞辩。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓雌芽,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辨嗽。 傳聞我的和親對(duì)象是個(gè)殘疾皇子世落,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容