91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C語言鏈接屬性怎么應用

發布時間:2022-03-19 13:34:19 來源:億速云 閱讀:135 作者:小新 欄目:開發技術

小編給大家分享一下C語言鏈接屬性怎么應用,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

    什么是鏈接屬性

    鏈接屬性與C語言中各個目標文件及函數的鏈接過程有關,用于認定不同文件的標識符(即程序中定義的各種名稱,包括變量名、函數名)是否是同一個實體。更通俗地說,就是在兩個不同文件中的變量、函數聲明是否指向同一個實體。比如:a、b文件同時聲明了變量c,鏈接屬性就指定了這兩處變量c是否是同一個c。

    簡單來說,鏈接屬性的作用就是讓你能在a文件中決定要不要訪問b文件中的變量、函數。

    鏈接屬性的分類

    鏈接屬性有三種:

    • external - 外部鏈接

    • internal - 內部鏈接

    • none - 無鏈接

    對于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);
    }

    實踐應用

    extern

    在a文件中想要使用b文件中定義的external屬性標識符,可使用extern關鍵字在a文件中聲明。

    即使該標識符所在位置默認鏈接屬性為external,也建議使用extern關鍵字顯式說明,有利于增加程序可讀性。

    static

    在a文件定義了一個全局標識符,但不想被其他文件訪問,可以對該標識符加上static關鍵字。

    在a、b文件中定義了同樣的標識符,通過static關鍵字可以避免多重定義問題。

    再次提醒:只有對原本缺省的鏈接屬性為external的標識符,才能用static關鍵字改變其鏈接屬性為internal

    一些細節

    • 對于external屬性的標識符,你可以在多個不同源文件中聲明,但是你只能在一處初始化。否則就會出現重復定義的問題:multiple definition of 'a';

    • extern關鍵字聲明的標識符用于訪問其他文件中定義的同名的標識符,因此無法進行初始化。如果你對extern聲明的變量進行初始化就會生成警告:warning: ‘a’ initialized and declared ‘extern’

    • 如果在其他文件中不存在相應的標識符定義,卻在當前文件中使用了extern聲明,會報錯:undefined reference to 'a',原理同2。

    • external屬性的標識符總是靜態存儲類型。

    • static關鍵字還有改變存儲類型的作用,因此,其作用與上下文環境有關,只有對于默認鏈接屬性為external的標識符,才有改變鏈接屬性的作用。

    • C++中,const變量隱含的具有internal屬性,C中并不具有這一性質。

    思考題

    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=%d\n", a);
        return 0;
    }

    b.c:

    int a=1;

    編譯后結果為:

    a=3

    以上僅為不完善的個人猜想,拋開隔絕外部鏈接這一點不談,就內部鏈接這一名稱而言,筆者對為什么要在同一個文件內部使用鏈接的設計仍然存疑,但目前該話題的答案超出了筆者的理解,因此更深入的討論暫時留白。

    拓展:感興趣的同學可以嘗試學習鏈接相關知識,或許會找到更確定的答案。

    以上是“C語言鏈接屬性怎么應用”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    稻城县| 项城市| 正阳县| 依安县| 德安县| 青浦区| 梁河县| 湛江市| 乌拉特中旗| 文化| 万宁市| 天台县| 贡山| 西乌珠穆沁旗| 徐水县| 广水市| 蓬溪县| 建湖县| 南郑县| 邯郸市| 宝清县| 抚松县| 鲁山县| 枣庄市| 寿光市| 浦北县| 吴川市| 连城县| 巴林左旗| 庆阳市| 赤壁市| 邵武市| 体育| 安宁市| 章丘市| 沁源县| 青神县| 翼城县| 漯河市| 西宁市| 柳林县|