欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2013年05月23日 16:08:36   作者:  
本篇文章適合新手。是對c語言中強符號與弱符號的使用進行了詳細的分析介紹,需要的朋友參考下
聲明:下面的實例全部在linux下嘗試,window下未嘗試。有興趣者可以試一下。文章針c初學者。
c語言的強符號和弱符號是c初學者經(jīng)常容易犯錯的地方。而且很多時候,特別是多人配合開發(fā)的程序,它引起的問題往往非常行為怪異而且難以定位。
什么是強符號和弱符號?
在c語言中,函數(shù)和初始化的全局變量是強符號,未初始化的全局變量時弱符號。強符號和弱符號的定義是連接器用來處理多重定義符號的,它的規(guī)則是:
不允許多個強符號;
如果一個強符號和一個弱符號,這選擇強符號;
如果多個弱符號,則任意選一個。
它的陷阱:
上代碼:
復制代碼 代碼如下:

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

相關文章

  • 淺析C++中memset,memcpy,strcpy的區(qū)別

    淺析C++中memset,memcpy,strcpy的區(qū)別

    本篇文章是對C++中memset,memcpy,strcpy的區(qū)別進行了詳細的分析介紹,需要的朋友參考下
    2013-07-07
  • C++STL之string類的使用

    C++STL之string類的使用

    這篇文章主要為大家詳細介紹了C++STL中的string類,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • C/C++獲取Windows平臺CPU占用率的方法

    C/C++獲取Windows平臺CPU占用率的方法

    最近在做系統(tǒng)信息相關的接口,為了實現(xiàn)跨平臺,故在linux和Windows平臺獲取占用率信息,文章主要介紹Windows下的方法,文中給出了參考代碼,需要的朋友可以參考下
    2023-12-12
  • vscode調(diào)試使用make編譯的項目

    vscode調(diào)試使用make編譯的項目

    VSCode本身是一個代碼編輯器,自帶的編譯功能比較弱,本文主要介紹了vscode調(diào)試使用make編譯的項目,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Qt生成隨機數(shù)的方法

    Qt生成隨機數(shù)的方法

    本文主要介紹了Qt生成隨機數(shù),生成隨機數(shù)主要用到了函數(shù)qsrand和qrand,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C語言實現(xiàn)飛機售票系統(tǒng)

    C語言實現(xiàn)飛機售票系統(tǒng)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)飛機售票系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Qt實現(xiàn)http服務的示例代碼

    Qt實現(xiàn)http服務的示例代碼

    這篇文章將為大家詳細講解有關Qt如何實現(xiàn)http服務,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲
    2023-04-04
  • 判斷兩顆二叉樹是否相似的兩種方法

    判斷兩顆二叉樹是否相似的兩種方法

    今天小編就為大家分享一篇關于判斷兩顆二叉樹是否相似的兩種方法,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • c++標準輸入輸出流關系的前世今生

    c++標準輸入輸出流關系的前世今生

    這篇文章主要給大家介紹了關于c++標準輸入輸出流關系的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • C++使用ffmpeg實現(xiàn)rtsp取流的代碼

    C++使用ffmpeg實現(xiàn)rtsp取流的代碼

    這篇文章主要介紹了C++使用ffmpeg實現(xiàn)rtsp取流,文章介紹了ffmepg采用rtsp取流流程圖,CMakeLists.txt編寫方法,通過示例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-04-04

最新評論