<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
連結屬性與C語言中各個目標檔案及函數的連結過程有關,用於認定不同檔案的識別符號(即程式中定義的各種名稱,包括變數名、函數名)是否是同一個實體。更通俗地說,就是在兩個不同檔案中的變數、函數宣告是否指向同一個實體。比如:a、b檔案同時宣告了變數c,連結屬性就指定了這兩處變數c是否是同一個c。
簡單來說,連結屬性的作用就是讓你能在a檔案中決定要不要存取b檔案中的變數、函數。
連結屬性有三種:
對於external屬性的識別符號,不同檔案中出現的多個同名稱識別符號指向同一個實體。在C語言中,用extern關鍵字在宣告中指定以參照其他檔案中定義的相同識別符號。
對於internal屬性的識別符號,僅在當前檔案內該識別符號指向同一個實體。在C語言中,用static關鍵字在宣告中指定讓識別符號變為該檔案私有(只有對原本預設的連結屬性為external的識別符號,才能用static關鍵字改變其連結屬性為internal)。
對於none屬性的識別符號,在每個宣告位置都是一個新的實體。C語言中,沒有對應的關鍵字。
識別符號的預設的連結屬性與其出現的位置有關。
程式的全域性變數、所有函數預設的連結屬性為external。
其餘識別符號的預設連結屬性為none。
在以下例子中,b、c、f的連結屬性就是external:
typedef char *a; int b; int c(int d) { int e; int f(int g); }
在a檔案中想要使用b檔案中定義的external屬性識別符號,可使用extern關鍵字在a檔案中宣告。
即使該識別符號所在位置預設連結屬性為external,也建議使用extern關鍵字顯式說明,有利於增加程式可讀性。
在a檔案定義了一個全域性識別符號,但不想被其他檔案存取,可以對該識別符號加上static關鍵字。
在a、b檔案中定義了同樣的識別符號,通過static關鍵字可以避免多重定義問題。
再次提醒:只有對原本預設的連結屬性為external的識別符號,才能用static關鍵字改變其連結屬性為internal
multiple definition of 'a';
。warning: ‘a’ initialized and declared ‘extern’
。undefined reference to 'a'
,原理同2。internal和none屬性除了作用域不同還有什麼區別?
以下程式碼一定程度上闡釋了部分割區別:
static int i; // definition // static storage // internal linkage void f(void) { extern int i; // declaration // refers to the static i at file scope // note that even though the specifier is extern // its linkage is intern (this is legal in both C/C++) { int i; // definition // automatic storage // no linkage } }
實際上連結屬性和作用域是兩個概念。之所以產生以上問題,因為internal屬性識別符號出現的位置都是在檔案作用域,而none往往在程式碼塊作用域。此處想引起讀者對內連線更深入的思考,見問題2。
檔案作用域已經能讓程式存取同一檔案變數,那麼再進行內部連結的意義在哪?
同一個識別符號在連結中只能存在一個,那麼通過內部連結的方式可以隔絕同名外部連結,且限定了外部編譯單元不能存取該檔案全域性識別符號。
a.c:
#include <stdio.h> static int a=3; int main(void) { extern int a; printf("a=%dn", a); return 0; }
b.c:
int a=1;
編譯後結果為:
a=3
以上僅為不完善的個人猜想,拋開隔絕外部連結這一點不談,就內部連結這一名稱而言,筆者對為什麼要在同一個檔案內部使用連結的設計仍然存疑,但目前該話題的答案超出了筆者的理解,因此更深入的討論暫時留白。
拓展:感興趣的同學可以嘗試學習連結相關知識,或許會找到更確定的答案。
《Pointers On C》
到此這篇關於C語言連結屬性的文章就介紹到這了,更多相關C語言連結屬性內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45