麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

新手小心:c語言中強符號與弱符號的使用

2020-01-26 16:10:43
字體:
供稿:網(wǎng)友
聲明:下面的實例全部在linux下嘗試,window下未嘗試。有興趣者可以試一下。文章針c初學(xué)者。
c語言的強符號和弱符號是c初學(xué)者經(jīng)常容易犯錯的地方。而且很多時候,特別是多人配合開發(fā)的程序,它引起的問題往往非常行為怪異而且難以定位。
什么是強符號和弱符號?
在c語言中,函數(shù)和初始化的全局變量是強符號,未初始化的全局變量時弱符號。強符號和弱符號的定義是連接器用來處理多重定義符號的,它的規(guī)則是:
不允許多個強符號;
如果一個強符號和一個弱符號,這選擇強符號;
如果多個弱符號,則任意選一個。
它的陷阱:
上代碼:
復(fù)制代碼 代碼如下:

//main.c
#include <stdio.h>
int fun();
int x;
int main()
{
 printf("in main.c:x=%p/n", &x);
 fun();
 return 0;
}
//test.c
#include <stdio.h>
int x;
int fun()
{
 printf("in test.c:x=%p/n", &x);
 return 0;
}

編譯:gcc main.c test.c,運行,結(jié)果:
in main.c:x=0x80496a8
in test.c:x=0x80496a8
兩個x是一個變量。這也許可以說的過去,可能一個忘記加extern了。
再看:
復(fù)制代碼 代碼如下:

//main.c
#include <stdio.h>
int fun();
int x;
int main()
{
 printf("in main.c:&x=%p/n", &x);
 fun();
 return 0;
}

復(fù)制代碼 代碼如下:

//test.c
#include <stdio.h>
struct
{
<span style="white-space:pre"> </span>char a;
<span style="white-space:pre"> </span>char b;
<span style="white-space:pre"> </span>char c;
<span style="white-space:pre"> </span>char d;<span style="white-space:pre"> </span>

復(fù)制代碼 代碼如下:

<span style="white-space:pre"> </span>int t;

復(fù)制代碼 代碼如下:

} x;
int fun()
{
 printf("in test.c:&x=%p/n", &x);
 return 0;
}

運行結(jié)果:
in main.c:&x=0x80496e0
in test.c:&x=0x80496e0
連接器還認(rèn)為他們是一個變量,這個時候程序員非常可能認(rèn)為他們是兩個變量(或者說優(yōu)秀的程序員會)。而事實卻相反,同一塊內(nèi)存,在不同的文件中會有不同的類型和含義。這兩個文件對這塊內(nèi)存讀寫的過程中,都會影響到對方,引發(fā)非常詭異的問題。
設(shè)想一下,如果是一個程序同時又多個人員來開發(fā),如果他們只有有一個全局變量重名,且沒有初始化,那么就會引發(fā)問題了。
在一個程序中出現(xiàn)問題還算好,畢竟代碼都在一起。如果你使用的動態(tài)庫或者靜態(tài)庫中有未初始化的全局變量,并且恰好也和你定義的重名,結(jié)果如何?我嘗試過,和上面一樣,沖突的兩個變量地址也相同。而這個時候你如果沒有庫的源碼,當(dāng)發(fā)生了問題,變量被修改,你估計要走很多彎路才能想到是庫改了你的變量。這是我曾經(jīng)解決過的一個問題。從那之后,我要求我們公司所有庫的源碼中不可以出現(xiàn)非static全局變量。
如何避免?
1、上策:想辦法消除全局變量。全局變量會增加程序的耦合性,對他要控制使用。如果能用其他的方法代替最好。
2、中策:實在沒有辦法,那就把全局變量定義為static,它是沒有強弱之分的。而且不會和其他的全局符號產(chǎn)生沖突。至于其他文件可能對他的訪問,可以封裝成函數(shù)。把一個模塊的數(shù)據(jù)封裝起來是一個好的實踐。
3、下策:把所有的符號全部都變成強符號。所有的全局變量都初始化,記住,是所有的。如果一個沒有初始化,就可能會和其他人產(chǎn)生沖突,盡管別人初始化了。(自己寫代碼測試一下)。
4、必備之策:GCC提供了一個選項,可以檢查這類錯誤:-fno-common。
c語言為什么設(shè)計它?
容易引發(fā)問題,怎么回事C的一個特性?可能是歷史的原因,沒有深究。但我認(rèn)為也可能是部分語言設(shè)計哲學(xué)的原因:c語言的設(shè)計哲學(xué)有一點就是充分的相信程序員,給他們最大的權(quán)利和靈活性。這個特性在某些特殊的情況下也許可能發(fā)揮作用。
語言中的君子和小人:
古人說要近君子,遠(yuǎn)小人。像今天說的這個特性(共同體也可以算一個),應(yīng)該是c語言中的“小人”(輕拍,可能說的比較重)。我們還是敬而遠(yuǎn)之的比較好。康熙好像說過,(特殊時期)治國不但要用君子,還要會用小人,但要能夠駕馭得當(dāng)。否則會引火燒身。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 精品一区久久久 | 欧美黄色性生活视频 | 做爰裸体激情2 | 一区二区美女视频 | av在线成人 | 2021免费日韩视频网 | 黄色大片大毛片 | 特片网久久 | 嫩呦国产一区二区三区av | fc2国产成人免费视频 | 国产做爰全免费的视频黑人 | 国产 视频 一区二区 | 成熟女人特级毛片www免费 | 九九热精品视频在线 | 成人影片在线免费观看 | 亚州精品国产 | 亚洲精品欧美二区三区中文字幕 | 亚洲欧美日韩一区二区三区在线观看 | 国产高潮失禁喷水爽到抽搐视频 | 成人短视频在线观看 | 羞羞答答xxdd在线播放 | 狠狠ri| 国产成人精品免高潮在线观看 | 黄色av电影在线 | 久色伊人 | 久久影院国产精品 | 亚洲一二区视频 | 精品国产视频一区二区三区 | www.48xx.com| 精品一区二区三区中文字幕老牛 | a免费看 | 国产瑟瑟视频 | 久草在线最新免费 | 色淫影院| 国产九色91| 亚洲va在线 | 伊人午夜 | 黄色一级片在线观看 | 一边吃奶一边插下面 | 国产人成免费爽爽爽视频 | 中文字幕一区在线观看视频 |