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

C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)解析(extern,static,typedef,const)

 更新時(shí)間:2013年10月12日 10:12:05   作者:  
本篇文章是對(duì)C語(yǔ)言基礎(chǔ)知識(shí)點(diǎn)(extern,static,typedef,const)的用法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以過(guò)來(lái)參考下

一、extern的使用方法

下面是《C語(yǔ)言程序設(shè)計(jì)》中的關(guān)于extern的解釋?zhuān)?/P>

在一個(gè)源程序的所有源文件中,一個(gè)外部變量只能在某個(gè)文件中定義一次,而其他文件可以通過(guò)extern聲明來(lái)訪問(wèn)它(定義外部變量的源文件中也可以包含對(duì)該外部變量的extern聲明)。外部變量的定義中必須指定數(shù)組的長(zhǎng)度,但extern聲明不一定指定數(shù)組的長(zhǎng)度。

外部變量的初始化只能出現(xiàn)在其定義中。

假設(shè)函數(shù)push與pop定義在一個(gè)文件中,而變量val與sp在另一個(gè)文件中定義本那個(gè)被初始化(通常不太可能這樣組織程序),則需要通過(guò)下面這些定義與申明把這些函數(shù)與聲明“綁定”在一起:

在文件file1中:

extern int sp;

extern double val[];

void push(double f)  {.......}

double pop(void)  {........}

在文件file2中:

int sp=0;

double val[MAX_SIZE];

由于在file1中的extern申明不僅放在函數(shù)的外部,還放在它們的最前面,因此它們適用于該文件中的所有函數(shù)。對(duì)于file1,這樣一組聲明就夠了。如果要在同一文件中先使用、后定義變量sp與val,也需按照這種方式組織文件。

使用通俗的語(yǔ)言總結(jié)extern的使用方法,殼分為下面三種情況:

1) extern修飾變量的聲明。舉例來(lái)說(shuō),如果文件a.c需要引用b.c中變量int v,就可以在a.c中聲明extern int v,然后就可以引用變量v。這里需要注意的是,被引用的變量v的鏈接屬性必須是外鏈接(external)的,也就是說(shuō)a.c要引用到v,不只是取決于在a.c中聲明extern int v,還取決于變量v本身是能夠被引用到的。這涉及到c語(yǔ)言的另外一個(gè)話題--變量的作用域。能夠被其他模塊以extern修飾符引用到的變量通常是全局變量。還有很重要的一點(diǎn)是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函數(shù)fun定義的開(kāi)頭處聲明extern int v,然后就可以引用到變量v了,只不過(guò)這樣只能在函數(shù)fun作用域中引用v罷了,這還是變量作用域的問(wèn)題。對(duì)于這一點(diǎn)來(lái)說(shuō),很多人使用的時(shí)候都心存顧慮。好像extern聲明只能用于文件作用域似的。

2) extern修飾函數(shù)聲明。從本質(zhì)上來(lái)講,變量和函數(shù)沒(méi)有區(qū)別。函數(shù)名是指向函數(shù)二進(jìn)制塊開(kāi)頭處的指針。如果文件a.c需要引用b.c中的函數(shù),比如在b.c中原型是int fun(int mu),那么就可以在a.c中聲明extern int fun(int mu),然后就能使用fun來(lái)做任何事情。就像變量的聲明一樣,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范圍中。對(duì)其他模塊中函數(shù)的引用,最常用的方法是包含這些函數(shù)聲明的頭文件。使用extern和包含頭文件來(lái)引用函數(shù)有什么區(qū)別呢?extern的引用方式比包含頭文件要簡(jiǎn)潔得多!extern的使用方法是直接了當(dāng)?shù)?,想引用哪個(gè)函數(shù)就用extern聲明哪個(gè)函數(shù)。這大概是KISS原則的一種體現(xiàn)吧!這樣做的一個(gè)明顯的好處是,會(huì)加速程序的編譯(確切的說(shuō)是預(yù)處理)的過(guò)程,節(jié)省時(shí)間。在大型C程序編譯過(guò)程中,這種差異是非常明顯的。

3) 此外,extern修飾符可用于指示C或者C++函數(shù)的調(diào)用規(guī)范。比如在C++中調(diào)用C庫(kù)函數(shù),就需要在C++程序中用extern “C”聲明要引用的函數(shù)。這是給鏈接器用的,告訴鏈接器在鏈接的時(shí)候用C函數(shù)規(guī)范來(lái)鏈接。主要原因是C++和C程序編譯完成后在目標(biāo)代碼中命名規(guī)則不同。這個(gè)用法的說(shuō)明在下篇文章。

下面再歸納解釋一下extern的用法:

在C語(yǔ)言中,修飾符extern用在變量或者函數(shù)的聲明前,用來(lái)說(shuō)明“此變量/函數(shù)是在別處定義的,要在此處引用”。

1. extern修飾變量的聲明。舉例來(lái)說(shuō),如果文件a.c需要引用b.c中變量int v,就可以在a.c中聲明extern int v,然后就可以引用變量v。這里需要注意的是,被引用的變量v的鏈接屬性必須是外鏈接(external)的,也就是說(shuō)a.c要引用到v,不只是取決于在a.c中聲明extern int v,還取決于變量v本身是能夠被引用到的。這涉及到c語(yǔ)言的另外一個(gè)話題--變量的作用域。能夠被其他模塊以extern修飾符引用到的變量通常是全局變量。還有很重要的一點(diǎn)是,extern int v可以放在a.c中的任何地方,比如你可以在a.c中的函數(shù)fun定義的開(kāi)頭處聲明extern int v,然后就可以引用到變量v了,只不過(guò)這樣只能在函數(shù)fun作用域中引用v罷了,這還是變量作用域的問(wèn)題。對(duì)于這一點(diǎn)來(lái)說(shuō),很多人使用的時(shí)候都心存顧慮。好像extern聲明只能用于文件作用域似的。

2. extern修飾函數(shù)聲明。從本質(zhì)上來(lái)講,變量和函數(shù)沒(méi)有區(qū)別。函數(shù)名是指向函數(shù)二進(jìn)制塊開(kāi)頭處的指針。如果文件a.c需要引用b.c中的函數(shù),比如在b.c中原型是int fun(int mu),那么就可以在a.c中聲明extern int fun(int mu),然后就能使用fun來(lái)做任何事情。就像變量的聲明一樣,extern int fun(int mu)可以放在a.c中任何地方,而不一定非要放在a.c的文件作用域的范圍中。對(duì)其他模塊中函數(shù)的引用,最常用的方法是包含這些函數(shù)聲明的頭文件。使用extern和包含頭文件來(lái)引用函數(shù)有什么區(qū)別呢?extern的引用方式比包含頭文件要簡(jiǎn)潔得多!extern的使用方法是直接了當(dāng)?shù)模胍媚膫€(gè)函數(shù)就用extern聲明哪個(gè)函數(shù)。這大概是KISS原則的一種體現(xiàn)吧!這樣做的一個(gè)明顯的好處是,會(huì)加速程序的編譯(確切的說(shuō)是預(yù)處理)的過(guò)程,節(jié)省時(shí)間。在大型C程序編譯過(guò)程中,這種差異是非常明顯的。

3. 此外,extern修飾符可用于指示C或者C++函數(shù)的調(diào)用規(guī)范。比如在C++中調(diào)用C庫(kù)函數(shù),就需要在C++程序中用extern “C”聲明要引用的函數(shù)。這是給鏈接器用的,告訴鏈接器在鏈接的時(shí)候用C函數(shù)規(guī)范來(lái)鏈接。主要原因是C++和C程序編譯完成后在目標(biāo)代碼中命名規(guī)則不同。

二、static的使用方法

下面是《C語(yǔ)言程序設(shè)計(jì)》中的關(guān)于static的解釋?zhuān)?/P>

外部的static聲明通常多用于變量,當(dāng)然,它也可用于聲明函數(shù)。通常情況下,函數(shù)名字是全局可訪問(wèn)的,對(duì)整個(gè)程序的各個(gè)部分而言都可見(jiàn)。但是,如果把函數(shù)申明為static類(lèi)型,則該函數(shù)名除了對(duì)該函數(shù)申明所在的文件可見(jiàn)外,其他文件都不可見(jiàn)。

static也可用于申明內(nèi)部變量。static類(lèi)型的內(nèi)部變量同自動(dòng)變量一樣,是某個(gè)特定函數(shù)的局部變量,只能在該函數(shù)中使用,但它與自動(dòng)變量不同的是,不管其所在的函數(shù)是否別調(diào)用,它一直存在,而不像自動(dòng)變量那樣,隨著所在函數(shù)的調(diào)用和退出而存在和消失。換句話說(shuō),static類(lèi)型的內(nèi)部變量是一種只能在某個(gè)特定函數(shù)中使用但一直占據(jù)空間的變量。

使用通俗的說(shuō)法解釋關(guān)于static的三種用法:

1)在函數(shù)體,一個(gè)被聲明為靜態(tài)的變量在這一函數(shù)被調(diào)用過(guò)程中維持其值不變。這個(gè)變量也成為靜態(tài)局部變量。

2)在模塊內(nèi)(但在函數(shù)體外),一個(gè)被聲明為靜態(tài)的變量可以被模塊內(nèi)所用函數(shù)訪問(wèn),但不能被模塊外其它函數(shù)訪問(wèn)。它是一個(gè)本地的靜態(tài)全局變量。

3)在模塊內(nèi),一個(gè)被聲明為靜態(tài)的函數(shù)只可被這一模塊內(nèi)的其它函數(shù)調(diào)用。那就是,這個(gè)函數(shù)被限制在聲明它的模塊的本地范圍內(nèi)使用。

三、typedef的使用方法

下面是《C語(yǔ)言程序設(shè)計(jì)》中的關(guān)于typedef的解釋?zhuān)?/P>

從任何意義上上講,typedef申明并沒(méi)有創(chuàng)建一個(gè)新類(lèi)型,它只是為某個(gè)已存在的類(lèi)型增加了一個(gè)新的名稱(chēng)而已。typedef聲明也沒(méi)有增加任何新的語(yǔ)義,通過(guò)這種方式聲明的變量和通過(guò)普通聲明方式聲明的具有完全相同的屬性。實(shí)際上,typedef類(lèi)似于#define語(yǔ)句,但由于typedef是由編譯器解釋的,因此它的文本替換功能要超過(guò)處理器的能力。例如:

typedef int (*PFI)(char *, char * );

該語(yǔ)句定義了類(lèi)型PFI是“一個(gè)指向函數(shù)的指針“,該函數(shù)具有兩個(gè)char*的參數(shù),返回值類(lèi)型為int *.

除了表達(dá)方式更簡(jiǎn)潔之外,使用typedef還有另外的兩個(gè)重要原因。首先,它可以使程序參數(shù)化,以提高程序的可移植性。如果typedef聲明的數(shù)據(jù)類(lèi)型同機(jī)器有關(guān)。那么,當(dāng)程序移植到其他機(jī)器上時(shí),只需要改變typedef類(lèi)型定義即可。一個(gè)經(jīng)常使用的情況,對(duì)于各種不同大小的整形來(lái)說(shuō),都使用通過(guò)typedef定義的類(lèi)型名,然后,分別為各個(gè)不同的宿主機(jī)選擇一組合適的short 、int和long類(lèi)型大小即可。標(biāo)準(zhǔn)庫(kù)中有一些例子,例如size_t和ptrdiff_t等。

四、const的使用方法

C語(yǔ)言中const代表著”不可變“,基本和常量一樣不可修改,但是應(yīng)用場(chǎng)景不一樣。

1) 應(yīng)用在變量

const char a='A';

a='B';  //錯(cuò)誤,變量a的值不可以修改。

此時(shí)代表變量a值不可改變,任何企圖修改a變量值的語(yǔ)句(例如a=20;)都會(huì)報(bào)錯(cuò)。

2) 應(yīng)用在指針

應(yīng)用在*左邊

const char *p;

char const *p;

以上兩條語(yǔ)句作用一樣,都是表示指針指向的變量值不可以修改,但指針可以修改。

例如1;
const char *p='A';

char *q;

*p='B';  //錯(cuò),指針指向的值不可以修改。

p=q;  //對(duì),指針值可以修改

應(yīng)用在*右邊

char *const *p;

表示指針值(指針指向的位置)不可以改變,但指針指向的值可以改變。

例如2:

復(fù)制代碼 代碼如下:

char *const *p='A';

char *q;

*P='b';  // 對(duì),指針指向的值可以修改。

p=q;  //錯(cuò)誤,指針值不可以修改。


總之,const在*左邊,表示指針指向的值不可以修改。const在*右邊,表示指針值(也就是指針指向的位置)不可以修改。

3)應(yīng)用在函數(shù)參數(shù)

例如3:strcat(char *a,char const *b),將參數(shù)b指向的字符串,添加到參數(shù)a字符串的末尾。

此時(shí),參數(shù)*a值可以改變,但是表示參數(shù)*b值不可改變

相關(guān)文章

  • C++命名空間實(shí)例詳解

    C++命名空間實(shí)例詳解

    這篇文章主要介紹了C++命名空間實(shí)例詳解,有感興趣的同學(xué)可以研究下
    2021-02-02
  • VS2019如何添加頭文件路徑的方法步驟

    VS2019如何添加頭文件路徑的方法步驟

    這篇文章主要介紹了VS2019如何添加頭文件路徑的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • 詳解QT使用QtGui顯示QImage的幾種方法

    詳解QT使用QtGui顯示QImage的幾種方法

    本文主要介紹了QT使用QtGui顯示QImage的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • C++實(shí)現(xiàn)無(wú)重復(fù)字符的最長(zhǎng)子串

    C++實(shí)現(xiàn)無(wú)重復(fù)字符的最長(zhǎng)子串

    本文主要介紹了C++實(shí)現(xiàn)無(wú)重復(fù)字符的最長(zhǎng)子串,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 使用C++的inipp庫(kù)處理配置文件.ini的示例詳解

    使用C++的inipp庫(kù)處理配置文件.ini的示例詳解

    一個(gè)ini文件由多個(gè)節(jié)section組成,每個(gè)節(jié)由多個(gè)鍵值對(duì)組成,本文給大家介紹了使用第三方庫(kù)inipp來(lái)操作ini文件,文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • 深入探討C++ OpenCV如何實(shí)現(xiàn)圖像矯正

    深入探討C++ OpenCV如何實(shí)現(xiàn)圖像矯正

    這篇文章主要為大家詳細(xì)介紹了C++ OpenCV如何實(shí)現(xiàn)簡(jiǎn)單的圖像矯正功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • 詳解VisualS tudio Code開(kāi)發(fā)Arm嵌入式Linux應(yīng)用

    詳解VisualS tudio Code開(kāi)發(fā)Arm嵌入式Linux應(yīng)用

    本文介紹如何在 Visual Studio Code 中使用 Yocto Project 生成的 Linux SDK,并針對(duì) Arm 處理器進(jìn)行 C/C++ 應(yīng)用交叉編譯和調(diào)試,感興趣的朋友跟隨小編一起看看吧
    2021-04-04
  • Qt6+QML實(shí)現(xiàn)Windows屏幕錄制功能

    Qt6+QML實(shí)現(xiàn)Windows屏幕錄制功能

    Qt6提供了很多豐富的多媒體支持類(lèi),本文將為大家詳細(xì)介紹一下Qt6如何結(jié)合QML實(shí)現(xiàn)Windows屏幕錄制功能,文中的示例代碼簡(jiǎn)潔易懂,有需要的小伙伴可以參考一下
    2025-04-04
  • 基于C++ cin、cin.get()、cin.getline()、getline()、gets()函數(shù)的使用詳解

    基于C++ cin、cin.get()、cin.getline()、getline()、gets()函數(shù)的使用詳解

    學(xué)C++的時(shí)候,這幾個(gè)輸入函數(shù)弄的有點(diǎn)迷糊;這里做個(gè)小結(jié)
    2013-05-05
  • C++深入分析講解智能指針

    C++深入分析講解智能指針

    為了解決內(nèi)存泄漏的問(wèn)題,C++中提出了智能指針。內(nèi)存泄漏的產(chǎn)生原因有很多,即使我們正確的使用malloc和free關(guān)鍵字也有可能產(chǎn)生內(nèi)存泄漏,如在malloc和free之間如果存在拋異常,那也會(huì)產(chǎn)生內(nèi)存泄漏。這種問(wèn)題被稱(chēng)為異常安全
    2022-05-05

最新評(píng)論

霍山县| 苍梧县| 舟山市| 无棣县| 万载县| 乐陵市| 呼玛县| 任丘市| 奉节县| 吉林省| 民丰县| 绍兴县| 乐都县| 海南省| 海门市| 通渭县| 嘉鱼县| 江华| 应城市| 彭阳县| 宜兴市| 大竹县| 宁河县| 瑞金市| 连州市| 鲜城| 抚远县| 延津县| 浦北县| 宣汉县| 贵定县| 城固县| 札达县| 外汇| 阿克陶县| 玉山县| 山阴县| 中宁县| 永德县| 郁南县| 浮梁县|