亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

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

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

//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,運行,結果:
in main.c:x=0x80496a8
in test.c:x=0x80496a8
兩個x是一個變量。這也許可以說的過去,可能一個忘記加extern了。
再看:
復制代碼 代碼如下:

//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>
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>

復制代碼 代碼如下:

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

復制代碼 代碼如下:

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

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

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久免费视频这里只有精品| 精品视频中文字幕| 日韩av手机在线观看| 国产成人免费av电影| 亚洲黄色在线观看| 2019中文字幕在线| 亚洲国产精品视频在线观看| 狠狠综合久久av一区二区小说| 欧美裸体男粗大视频在线观看| 国产丝袜精品第一页| 精品国产31久久久久久| 亚洲欧美成人在线| 九九热最新视频//这里只有精品| 2018国产精品视频| 久久亚洲精品中文字幕冲田杏梨| 欧美视频在线观看免费网址| 亚洲第一区中文99精品| 揄拍成人国产精品视频| 亚洲一区二区三区成人在线视频精品| 欧美日韩亚洲国产一区| 亚洲成人久久一区| 一区二区av在线| 国产精品日韩欧美大师| 国自产精品手机在线观看视频| 日韩欧美成人精品| 亚洲精品久久久一区二区三区| 亚洲桃花岛网站| 欧美成人精品xxx| 欧美日韩国产成人在线观看| 久久久免费观看| 亚洲一区第一页| 91黑丝高跟在线| 亲爱的老师9免费观看全集电视剧| 91精品国产777在线观看| 欧美黑人国产人伦爽爽爽| 最近中文字幕2019免费| 欧美在线视频免费| 欧美精品在线免费| 日韩av综合网| 国产+成+人+亚洲欧洲| 亚洲午夜精品久久久久久久久久久久| 日韩激情在线视频| 国产一区二区三区欧美| 日本精品久久久久影院| 国产精品久久久久影院日本| 亚洲精品中文字幕女同| 91国内免费在线视频| 高清欧美性猛交xxxx| 国产午夜精品麻豆| 亚洲精品aⅴ中文字幕乱码| 136fldh精品导航福利| 狠狠久久亚洲欧美专区| 欧美激情视频在线观看| 欧美伦理91i| 中文字幕精品一区久久久久| 久久九九亚洲综合| 北条麻妃一区二区三区中文字幕| 中文字幕日本精品| 97热精品视频官网| 国产精品视频永久免费播放| 97在线免费观看| 国产精品久久久久久久久影视| 亚洲色图综合久久| 色哟哟亚洲精品一区二区| 91视频免费在线| 成人网址在线观看| 91免费国产网站| 日韩有码在线播放| 51午夜精品视频| 亚洲国产精品专区久久| 久久色在线播放| 日韩精品视频在线观看网址| 久久影院资源站| 欧美影院久久久| 国产成人亚洲综合青青| 成人久久久久久久| 久久久中精品2020中文| 欧美大荫蒂xxx| 亚洲欧美日韩直播| 亚洲人成啪啪网站| 国产精品久久久精品| 久久久久久91香蕉国产| 久久久亚洲影院你懂的| 日韩电影网在线| 亚洲天堂av在线播放| 久久这里有精品| 欧美三级xxx| 97在线视频国产| 一区二区三区四区精品| 亚洲色图35p| 国产精品嫩草影院一区二区| 日韩av在线不卡| 欧美电影免费在线观看| 亚洲人午夜色婷婷| 欧美大荫蒂xxx| 国产精品av免费在线观看| 狠狠色香婷婷久久亚洲精品| www.久久色.com| 亚洲最大福利网站| 国产亚洲美女精品久久久| 这里只有精品久久| 亚洲人午夜精品免费| 日韩中文字幕视频| 国产成人精品999| 亚洲成人在线视频播放| 亚洲精品suv精品一区二区| 亚洲精品99久久久久| 久久精品成人一区二区三区| 中文字幕久热精品视频在线| 日韩免费在线免费观看| 中文字幕亚洲一区二区三区五十路| 欧美激情免费看| 精品国产一区二区在线| 亚洲综合av影视| 成人做爰www免费看视频网站| 欧洲成人在线视频| 亚洲久久久久久久久久| 中文字幕视频在线免费欧美日韩综合在线看| 欧美成人精品在线| 一区二区在线视频播放| 青青草原一区二区| 久久久久久久一区二区三区| 国产精品女主播| 91麻豆国产语对白在线观看| 中文字幕欧美精品日韩中文字幕| 久热在线中文字幕色999舞| 在线成人免费网站| 国产69精品99久久久久久宅男| 国产噜噜噜噜久久久久久久久| 亚洲国产中文字幕久久网| 欧美国产精品va在线观看| 欧美在线观看日本一区| 国产精品视频自拍| 91香蕉嫩草神马影院在线观看| 久久香蕉频线观| 欧美另类69精品久久久久9999| 日韩久久精品电影| 久久不射热爱视频精品| 久久久国产一区二区三区| 丝袜美腿亚洲一区二区| 久久久精品免费视频| 精品日本美女福利在线观看| 91精品91久久久久久| 中文字幕欧美日韩va免费视频| 国产极品jizzhd欧美| 欧美一级片久久久久久久| 欧美日韩国产精品专区| 国产精品久久久久99| 国产美女搞久久| 亚洲免费中文字幕| 在线观看免费高清视频97| 青草热久免费精品视频| 欧美精品久久久久久久久| 国产三级精品网站| 亚洲色图13p| 国产精品高精视频免费| 欧美在线免费看| 69久久夜色精品国产69乱青草| 中文字幕9999| 国产精品久久一| 国内久久久精品| 国产欧美精品在线播放| 亚洲有声小说3d| 亚洲国产美女精品久久久久∴|