最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

什么是鏈接屬性

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

簡(jiǎn)單來(lái)說(shuō),鏈接屬性的作用就是讓你能在a文件中決定要不要訪問(wèn)b文件中的變量、函數(shù)。

鏈接屬性的分類

鏈接屬性有三種:

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

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

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

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

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

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

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

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

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

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

實(shí)踐應(yīng)用

extern

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

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

static

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

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

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

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

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

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

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

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

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

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

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

參考

總結(jié) 

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

您可能感興趣的文章:

相關(guān)文章

  • C++ vector容器 find erase的使用操作:查找并刪除指定元素

    C++ vector容器 find erase的使用操作:查找并刪除指定元素

    這篇文章主要介紹了C++ vector容器 find erase的使用操作:查找并刪除指定元素,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • C++下如何將TensorFlow模型封裝成DLL供C#調(diào)用

    C++下如何將TensorFlow模型封裝成DLL供C#調(diào)用

    這篇文章主要介紹了C++下如何將TensorFlow模型封裝成DLL供C#調(diào)用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容的string

    C語(yǔ)言實(shí)現(xiàn)動(dòng)態(tài)擴(kuò)容的string

    最近工作中使用C語(yǔ)言,但又苦于沒(méi)有高效的字符串實(shí)現(xiàn),字符串的拼接和裁剪都很麻煩,而且每個(gè)字符串都需要申請(qǐng)內(nèi)存,內(nèi)存的申請(qǐng)和釋放也很容易出bug,怎么高效的實(shí)現(xiàn)一個(gè)不需要處理內(nèi)存問(wèn)題并且可以動(dòng)態(tài)擴(kuò)容進(jìn)行拼接和裁剪的string呢?本文就來(lái)詳細(xì)講講
    2023-04-04
  • C語(yǔ)言實(shí)現(xiàn)單詞小助手

    C語(yǔ)言實(shí)現(xiàn)單詞小助手

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)單詞小助手,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • C++ stringstream類用法詳解

    C++ stringstream類用法詳解

    這篇文章主要介紹了C++ stringstream類用法詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C語(yǔ)言深入淺出分析函數(shù)指針

    C語(yǔ)言深入淺出分析函數(shù)指針

    函數(shù)指針是一個(gè)指針變量,它可以存儲(chǔ)函數(shù)的地址,然后使用函數(shù)指針,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言進(jìn)階教程之函數(shù)指針的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • C++入門(mén)概覽和嘗試創(chuàng)建第一個(gè)C++程序

    C++入門(mén)概覽和嘗試創(chuàng)建第一個(gè)C++程序

    這篇文章主要介紹了C++入門(mén)概覽和嘗試創(chuàng)建第一個(gè)C++程序,同時(shí)也包括編寫(xiě)類的示例展示C++面向?qū)ο蟮奶匦?需要的朋友可以參考下
    2015-09-09
  • 淺談C/C++ 語(yǔ)言中的表達(dá)式求值

    淺談C/C++ 語(yǔ)言中的表達(dá)式求值

    下面小編就為大家?guī)?lái)一篇淺談C/C++ 語(yǔ)言中的表達(dá)式求值。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-07-07
  • C++變換迭代器使用方法小結(jié)

    C++變換迭代器使用方法小結(jié)

    本文主要介紹了C++變換迭代器使用方法小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-04-04
  • C語(yǔ)言程序設(shè)計(jì)第五版譚浩強(qiáng)課后答案(第二章答案)

    C語(yǔ)言程序設(shè)計(jì)第五版譚浩強(qiáng)課后答案(第二章答案)

    這篇文章主要介紹了C語(yǔ)言程序設(shè)計(jì)第五版譚浩強(qiáng)課后答案(第二章答案),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-04-04

最新評(píng)論

永春县| 酉阳| 黔西县| 文登市| 张家川| 永修县| 从江县| 昔阳县| 图木舒克市| 湟中县| 会理县| 通海县| 当雄县| 盐池县| 新晃| 大方县| 淄博市| 上林县| 叙永县| 全州县| 永兴县| 怀化市| 乌审旗| 茶陵县| 安徽省| 北京市| 庆云县| 高淳县| 富宁县| 梧州市| 秀山| 上虞市| 贵州省| 郎溪县| 独山县| 鹤壁市| 介休市| 无为县| 东安县| 梓潼县| 天水市|