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

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

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

一、extern的使用方法

下面是《C語言程序設(shè)計》中的關(guān)于extern的解釋:

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

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

假設(shè)函數(shù)push與pop定義在一個文件中,而變量val與sp在另一個文件中定義本那個被初始化(通常不太可能這樣組織程序),則需要通過下面這些定義與申明把這些函數(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ù)。對于file1,這樣一組聲明就夠了。如果要在同一文件中先使用、后定義變量sp與val,也需按照這種方式組織文件。

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

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

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

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

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

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

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

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

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

二、static的使用方法

下面是《C語言程序設(shè)計》中的關(guān)于static的解釋:

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

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

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

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

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

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

三、typedef的使用方法

下面是《C語言程序設(shè)計》中的關(guān)于typedef的解釋:

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

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

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

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

四、const的使用方法

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

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

const char a='A';

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

此時代表變量a值不可改變,任何企圖修改a變量值的語句(例如a=20;)都會報錯。

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

應(yīng)用在*左邊

const char *p;

char const *p;

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

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

char *q;

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

p=q;  //對,指針值可以修改

應(yīng)用在*右邊

char *const *p;

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

例如2:

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

char *const *p='A';

char *q;

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

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


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

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    本文介紹如何在 Visual Studio Code 中使用 Yocto Project 生成的 Linux SDK,并針對 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提供了很多豐富的多媒體支持類,本文將為大家詳細(xì)介紹一下Qt6如何結(jié)合QML實(shí)現(xiàn)Windows屏幕錄制功能,文中的示例代碼簡潔易懂,有需要的小伙伴可以參考一下
    2025-04-04
  • 基于C++ cin、cin.get()、cin.getline()、getline()、gets()函數(shù)的使用詳解

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

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

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

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

最新評論

涡阳县| 永修县| 仲巴县| 桑日县| 前郭尔| 玉山县| 青冈县| 榆中县| 朔州市| 苍南县| 五华县| 化德县| 北宁市| 朝阳县| 颍上县| 延津县| 甘南县| 万山特区| 克什克腾旗| 福鼎市| 湖南省| 桃源县| 当雄县| 庆安县| 特克斯县| 商都县| 海南省| 阜康市| 手机| 南雄市| 濮阳市| 堆龙德庆县| 桦甸市| 永丰县| 武山县| 绥宁县| 岑巩县| 临夏市| 聊城市| 通海县| 东乡|