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

C語言鏈接屬性的實踐應(yīng)用

 更新時間:2022年03月19日 10:45:50   作者:p0ise  
C語言中鏈接屬性決定如何處理在不同文件中出現(xiàn)的標(biāo)示符,下面這篇文章主要給大家介紹了關(guān)于C語言鏈接屬性的實踐應(yīng)用,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下

什么是鏈接屬性

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

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

鏈接屬性的分類

鏈接屬性有三種:

  • external - 外部鏈接
  • internal - 內(nèi)部鏈接
  • none - 無鏈接

對于external屬性的標(biāo)識符,不同文件中出現(xiàn)的多個同名稱標(biāo)識符指向同一個實體。在C語言中,用extern關(guān)鍵字在聲明中指定以引用其他文件中定義的相同標(biāo)識符。

對于internal屬性的標(biāo)識符,僅在當(dāng)前文件內(nèi)該標(biāo)識符指向同一個實體。在C語言中,用static關(guān)鍵字在聲明中指定讓標(biāo)識符變?yōu)樵撐募接?/strong>(只有對原本缺省的鏈接屬性為external的標(biāo)識符,才能用static關(guān)鍵字改變其鏈接屬性為internal)。

對于none屬性的標(biāo)識符,在每個聲明位置都是一個新的實體。C語言中,沒有對應(yīng)的關(guān)鍵字。

默認(rèn)的鏈接屬性

標(biāo)識符的默認(rèn)的鏈接屬性與其出現(xiàn)的位置有關(guān)。

  • 程序的全局變量、所有函數(shù)默認(rèn)的鏈接屬性為external。

  • 其余標(biāo)識符的默認(rèn)鏈接屬性為none。

在以下例子中,b、c、f的鏈接屬性就是external:

typedef char *a;
int b;
int c(int d)
{
	int e;
	int f(int g);
}

實踐應(yīng)用

extern

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

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

static

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

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

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

一些細(xì)節(jié)

  • 對于external屬性的標(biāo)識符,你可以在多個不同源文件中聲明,但是你只能在一處初始化。否則就會出現(xiàn)重復(fù)定義的問題:multiple definition of 'a';。
  • extern關(guān)鍵字聲明的標(biāo)識符用于訪問其他文件中定義的同名的標(biāo)識符,因此無法進(jìn)行初始化。如果你對extern聲明的變量進(jìn)行初始化就會生成警告:warning: ‘a’ initialized and declared ‘extern’。
  • 如果在其他文件中不存在相應(yīng)的標(biāo)識符定義,卻在當(dāng)前文件中使用了extern聲明,會報錯:undefined reference to 'a',原理同2。
  • external屬性的標(biāo)識符總是靜態(tài)存儲類型。
  • static關(guān)鍵字還有改變存儲類型的作用,因此,其作用與上下文環(huán)境有關(guān),只有對于默認(rèn)鏈接屬性為external的標(biāo)識符,才有改變鏈接屬性的作用。
  • C++中,const變量隱含的具有internal屬性,C中并不具有這一性質(zhì)。

思考題

internal和none屬性除了作用域不同還有什么區(qū)別?

以下代碼一定程度上闡釋了部分區(qū)別:

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

實際上鏈接屬性和作用域是兩個概念。之所以產(chǎn)生以上問題,因為internal屬性標(biāo)識符出現(xiàn)的位置都是在文件作用域,而none往往在代碼塊作用域。此處想引起讀者對內(nèi)鏈接更深入的思考,見問題2。

文件作用域已經(jīng)能讓程序訪問同一文件變量,那么再進(jìn)行內(nèi)部鏈接的意義在哪?

同一個標(biāo)識符在鏈接中只能存在一個,那么通過內(nèi)部鏈接的方式可以隔絕同名外部鏈接,且限定了外部編譯單元不能訪問該文件全局標(biāo)識符。

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;

編譯后結(jié)果為:

a=3

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

拓展:感興趣的同學(xué)可以嘗試學(xué)習(xí)鏈接相關(guān)知識,或許會找到更確定的答案。

參考

總結(jié) 

到此這篇關(guān)于C語言鏈接屬性的文章就介紹到這了,更多相關(guān)C語言鏈接屬性內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關(guān)文章

  • C語言中pthread_create函數(shù)實現(xiàn)向線程函數(shù)傳遞參數(shù)

    C語言中pthread_create函數(shù)實現(xiàn)向線程函數(shù)傳遞參數(shù)

    本文主要介紹了C語言中pthread_create函數(shù)實現(xiàn)向線程函數(shù)傳遞參數(shù),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • C++實現(xiàn)猜數(shù)小游戲的實現(xiàn)

    C++實現(xiàn)猜數(shù)小游戲的實現(xiàn)

    這篇文章主要介紹了C++實現(xiàn)猜數(shù)小游戲的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析

    OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析

    這篇文章主要介紹了OnSize、OnSizing和OnGetMinMaxInfo區(qū)別分析,需要的朋友可以參考下
    2015-01-01
  • c++ 動態(tài)內(nèi)存分配相關(guān)總結(jié)

    c++ 動態(tài)內(nèi)存分配相關(guān)總結(jié)

    這篇文章主要介紹了c++ 動態(tài)內(nèi)存分配相關(guān)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)和使用c++,感興趣的朋友可以了解下
    2021-02-02
  • 成員函數(shù)的重載、覆蓋與隱藏詳細(xì)解析

    成員函數(shù)的重載、覆蓋與隱藏詳細(xì)解析

    成員函數(shù)的重載、覆蓋(override)與隱藏很容易混淆,C++程序員必須要搞清楚概念,否則錯誤將防不勝防
    2013-10-10
  • C++簡單又輕松的講解類和對象中友元函數(shù)

    C++簡單又輕松的講解類和對象中友元函數(shù)

    采用類的機(jī)制后實現(xiàn)了數(shù)據(jù)的隱藏與封裝,類的數(shù)據(jù)成員一般定義為私有成員,成員函數(shù)一般定義為公有的,依此提供類與外界間的通信接口。但是,有時需要定義一些函數(shù),這些函數(shù)不是類的一部分,但又需要頻繁地訪問類的數(shù)據(jù)成員,這時可以將這些函數(shù)定義為該類的友元函數(shù)
    2022-06-06
  • C語言中的for循環(huán)語句基本語法及使用

    C語言中的for循環(huán)語句基本語法及使用

    這篇文章主要介紹了C語言中的for循環(huán)語句基本語法及使用,本文結(jié)合實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-06-06
  • 基于VS2019配置opencv4.0的方法步驟

    基于VS2019配置opencv4.0的方法步驟

    這篇文章主要介紹了基于VS2019配置opencv4.0的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • C++高精度算法的使用場景詳解

    C++高精度算法的使用場景詳解

    在我們進(jìn)行計算的過程中,經(jīng)常會遇到幾十位,甚至幾百位的數(shù)字的計算問題,也有可能會遇到小數(shù)點后幾十位,幾百位的情況,而我們面對這樣的情況下,long long  和 double 的數(shù)據(jù)范圍顯然是不夠使用的了。因此這時,我們就需要引入一個新的算法,叫做高精度算法
    2022-09-09
  • C++小游戲教程之猜數(shù)游戲的實現(xiàn)

    C++小游戲教程之猜數(shù)游戲的實現(xiàn)

    這篇文章主要和大家詳細(xì)介紹如何利用C++做一個簡易的猜數(shù)游戲,分為用戶猜數(shù)和系統(tǒng)猜數(shù)。文中的示例代碼講解詳細(xì) ,感興趣的小伙伴可以嘗試一下
    2022-11-11

最新評論