1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時間:8:30-17:00
      你可能遇到了下面的問題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
      C/C++中名字空間與作用域的示例分析-創(chuàng)新互聯(lián)

      這篇文章將為大家詳細講解有關(guān)C/C++中名字空間與作用域的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

      創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計、網(wǎng)站建設(shè)、莒南網(wǎng)絡(luò)推廣、小程序設(shè)計、莒南網(wǎng)絡(luò)營銷、莒南企業(yè)策劃、莒南品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們大的嘉獎;創(chuàng)新互聯(lián)為所有大學生創(chuàng)業(yè)者提供莒南建站搭建服務(wù),24小時服務(wù)熱線:18982081108,官方網(wǎng)址:www.cdcxhl.com

      C語言中有名字空間這個概念嗎?

      提到名字空間(或者可能更普遍的叫法,命名空間),很可能先想到的是C++,甚至是C#。C中沒有名字空間吧?一開始我也是這樣認為的,直到我看了C primer plus這本書,才直到C語言中其實也有名字空間的概念!而為什么我們更熟悉C++中的名字空間呢?可能是因為我們一些C++程序,不過知不知道為什么,總是要加上一句using namespace std;吧。其實C語言中也是有名字空間的概念的,只不過C語言中不能自定義名字空間,而C++中,我們可以定義自己的名字空間。

      C語言中的名字空間和作用域

      在網(wǎng)上看過很多資料,很多人都認為名字空間是作用域的一個補充,認為名字空間是為了區(qū)分同一作用域下相同的標識符,解釋的也有一定道理。但是我在C primer plus中理解的是作用域是對名字空間的一個補充。我是這樣理解的:名字空間之間是相互獨立的,但是作用域之間卻有包含的關(guān)系,比如說一個全局變量和一個函數(shù)內(nèi)部的局部變量,全局變量的作用域是文件作用域,而局部變量的作用域是塊作用域,但是在函數(shù)內(nèi)部全局變量就消失了嗎?沒有呀,我們依然可以訪問全局變量,只不過當局部變量和全局變量同名時,全局變量被隱藏了而已。可能有點糊涂,沒關(guān)系,往下看。

      C語言中有4中名字空間

      C語言中的四種名字空間分別為:

      1、 所有的標簽(label)都屬于同一個命名空間。

      2、 struct、union和enum的名稱,在C99中稱之為tag,所有的tag屬于同一個命名空間。

      也就是說,如果你已經(jīng)聲明struct  A { int a }; 就不能再聲明 union A { int a };

      說明:之所以讓所有的tag組成一個命名空間,由于tag前面總是帶struct、union和enum關(guān)鍵字,所以編譯器可以將它們與其他的標識符區(qū)分開。

      3、 struct和union的成員位于它們各自struct或union命名空間下,相互獨立互不影響,并且可以形成遞歸的命名空間(如struct中在定義struct)。

      例如:如果你已經(jīng)聲明 struct A { int a };其成員的名稱為a,你仍然可以聲明 struct B { int a}; 或者 union B { int a };

      說明:之所以讓struct和union成員各自成為一個命名空間,是因為它們的成員訪問時,需要通過"."或"->"運算符,而不會單獨使用,所以編譯器可以將它們與其他的標識符區(qū)分開。由于枚舉類型enum的成員可以單獨使用,所以枚舉類型的成員不在這一名稱空間類。

      4、 其他所有的標識符,屬于同一個命名空間。包括變量名、函數(shù)、函數(shù)參數(shù),宏定義、typedef的類型名、enum的成員等等。

      C語言中有4種作用域

      C語言中四種作用域為:

      1、塊作用域

      塊作用域作用域整個大括號中,比如一個函數(shù)中的局部變量就具有塊作用域。還要注意,函數(shù)頭中的形式參數(shù)也是塊作用域,它的作用范圍也是整個函數(shù)體

      2、文件作用域

      文件作用域也叫全局作用域,作用范圍是整個文件。全局作用域有鏈接屬性一說,分為內(nèi)部鏈接屬性(靜態(tài)鏈接屬性)和外部鏈接屬性。當全局變量被static修飾的時候,有內(nèi)部鏈接屬性,也就是作用域為本.c文件,在其他.c文件中是不可見的。而當全局變量被extern修飾的時候(也是默認的情況,如果不寫,就默認extern),有外部鏈接屬性,也就是不僅作用域本.c文件,也作用域其他.c文件。之所以叫鏈接屬性,是因為C語言的編譯單元為一個.c文件,也就是說,如果在不同的.c文件中含有同名的全局變量,在編譯的時候是不會發(fā)現(xiàn)錯誤的,因為不同的.c文件時分別編譯的,編譯時期是相互獨立的。但是在鏈接階段就會報錯。

      3、函數(shù)作用域

      注意和塊作用域相互區(qū)分,函數(shù)體中的局部變量具有塊作用域,而不是函數(shù)作用域。所謂函數(shù)作用有,只針對“標號”。什么意思呢?我們知道C語言有個goto語句(當然由于goto語句使程序的邏輯混亂,所以C++中摒棄了goto語句),那么我們要goto到什么地方呢?這個地方是用一個叫“標號”的東西表示的。比如我們用goto語句實現(xiàn)一個循環(huán)。

      int i,sum=0;
      
      i=1;
      
      loop: if(i<=100)
      
      {
      
        sum=sum+i;
      
        i++;
      
        goto loop;
      
      }

      其中l(wèi)oop就是標號,他的作用域叫函數(shù)作用域,在函數(shù)內(nèi)部有效。

      4、函數(shù)原型作用域

      函數(shù)原型作用域就是在函數(shù)原型聲明時,形參的作用域。

      比如void fun(int a,int b);

      其中a和b的作用域就是函數(shù)原型作用域,作用域小括號內(nèi)部。注意和函數(shù)定義時,形參的作用域相區(qū)別,定義時,函數(shù)形參的作用域是塊作用域,在函數(shù)體內(nèi)有效。

      同一名字空間中的同一個作用域中,名字(標識符)只能唯一

      直接看例子吧,來的比較直接一些。

      #include 
      
      int fun = 10;
      
      void fun()
      
      {
      
        printf("hahaha\n");
      
      }
      
       
      
      int main()
      
      {
      
        return 0;
      
      }

      結(jié)果:編譯時出錯!

      C/C++中名字空間與作用域的示例分析

      原因就是 全局變量fun和函數(shù)fun有著相同的名字空間,都是位于第4種名字空間中,而且兩者的作用域都是文件作用域,同一名字空間和同一作用域中是不能夠有相同的標識符的。

      再來看一個例子:

      #include 
      
      struct fun{
      
        int a;
      
        int b;
      
      };
      
      void fun()
      
      {
      
        printf("hahaha\n");
      
      }
      
       
      
      int main()
      
      {
      
        return 0;
      
      }

      結(jié)果:通過編譯,沒有問題。

      這是因為,雖然struct fun和函數(shù)fun有著相同的作用域,都是文件作用域,但是有著不同的名字空間,struct fun屬于第二種名字空間,而函數(shù)fun屬于第四種名字空間。

      在看一個例子:

      #include 
      
      struct fun{
      
         int a;
      
         int b;
      
      };
      
      void fun()
      
      {
      
         printf("hahaha\n");
      
      }
      
       
      
      int main()
      
      {
      
         struct fun fun;
      
         fun.a = 10;
      
         fun.b = 20;
      
         return 0;
      
      }

      結(jié)果:編譯通過

      我們來看struct fun fun;這個語句,兩個fun并不沖突,因為他們有著不同的名字空間。第一個fun位于第二種名字空間中,而第二個fun位于第三種名字空間中,所以不沖突。

      再來看一個例子:

      #include 
      
      struct fun{
      
         int a;
      
         int b;
      
      };
      
      enum fun{
      
         A,
      
         B,
      
         C
      
      };
      
       
      
      int main()
      
      {
      
         return 0;
      
      }

      結(jié)果:編譯錯誤

      C/C++中名字空間與作用域的示例分析

      原因:struct funenum fun中的fun有著相同的名字空間,都是位于第二種名字空間中,而且他們的作用域都是文件作用域,所以一樣啦。

      再來看一個例子:

      #include 
      
      int a = 10;
      
      int b = 20;
      
       
      
      int main()
      
      {
      
         int b = 30;
      
         a = 50;
      
         printf("a = %d,b = %d\n",a,b);
      
         return 0;
      
      }

      結(jié)果:通過編譯,沒有問題

      原因,變量loop和標號loop位于不同的名字空間,變量loop位于第四種名字空間,而標號loop位于第一種名字空間。

      最后再看一個例子:

      #include 
      
      int a = 10;
      
      int b = 20;
      
       
      
      int main()
      
      {
      
         int b = 30;
      
         a = 50;
      
         printf("a = %d,b = %d\n",a,b);
      
         return 0;
      
      }

      結(jié)果,編譯通過:且輸出為:

      C/C++中名字空間與作用域的示例分析

      原因 雖然全局變量和局部變量位于同一個名字空間中,都是位于第4中名字空間中,但是全局變量b的作用域為文件作用域,而局部變量b的作用域為塊作用域,作用域小的b會將作用域大的b隱藏掉。

      其實這就是我認為,作用域是名字空間的一個補充,的原因。

      兩個b有著同樣的名字空間,但是有著大小不同的作用域,實際上文件作用域的作用范圍是包含塊作用域的作用范圍的,這也是為什么在函數(shù)內(nèi)部依然可以訪問全局變量a的原因。作用域?qū)嶋H上是包含的關(guān)系,小的作用域會將大的作用域隱藏掉。但是名字空間之間卻是相互獨立的,這一點在C++中,自定義名字空間時,會體會的更深刻。

      再次表明一下我的觀點,我認為,作用域是對名字空間的一個補充,當在同一個名字空間中,用作用域來描述名字(也就是標識符)的可見性,小的作用域會隱藏大的作用域。

      下面說說C++中的名字空間。

      首先,C++中繼承了C語言中的名字空間,也就是那四類名字空間在C++中依然適用。需要說明的是,類的名字,位于第二種名字空間中,類中的成員的名字位于第三種名字空間中,這一點和struct、enum等類似。

      C++中允許我們自定義名字空間,自定義的方法就是適用namespace關(guān)鍵字。

      先考慮這樣一個問題:

      一個工程中有多個.c文件,其中一個.c文件讓柯南完成,另外一個.c文件讓小蘭完成。這兩個人心有靈犀,都定義了一個叫conan的全局變量,這個時候當工程鏈接的時候就會報錯。原因是兩個conan有同樣的名字空間,都是位于第4種名字空間中,也有著同樣的作用域,都是文件作用域,于是這兩個conan就沖突了。

      怎么解決呢?

      前面提到過,只有同一個名字空間中同一作用域下,相同的名字才會沖突。所以要解決沖突無非就是修改名字空間或者作用域。首先說修改作用域,前面提到過,文件作用域的標識符有一個鏈接屬性,static修飾的,的作用域僅僅限于本.c文件,而extern(或者默認情況下)作用域是所有.c文件,所以我們可以個其中一個conan加上static修飾,這樣就改變了作用域,就不會沖突了,但是問題是,我們既然定義成全局變量,通常情況下,我們都希望它有外部鏈接屬性。我們之所以定義成全局變量,很可能就是為了讓其他.c文件使用。所以static雖然解決了沖突,但是沒有達到我們的目的。那么我們只能夠用另一種方法解決沖突了,就是修改名字空間,這在C語言中是不可行的,因為C語言中就那4中名字空間。但是在C++中是可行的,因為C++可以自定義名字空間。

      于是柯南將他的int conan;寫成了:

      namespace nan
      
      {
      
        int conan;
      
      }

      小蘭將他的int conan;寫成了:

      namespace lan
      
      {
      
        int conan;
      
      }

      這樣柯南的conan就在名字空間nan中了,而小蘭conan就在名字空間lan中了,就不沖突了。

      但是需要注意,在其他文件中引用時,需要帶上名字空間名比如,lan.conan;

      至于namespace的詳細用法,以及using namespace的使用,就不寫了,大家看書就好。

      最后提一下C語言中怎樣解決命名沖突。

      C語言中怎樣解決命名沖突呢?C語言并不支持自定義名字空間,所以解決命名沖突貌似只能是:1、 如果可能的話用static修飾(有些情況是不能能用static修飾的,比如提供給外部使用的函數(shù))2、在命名上下功夫,比如使用前綴,比如libnids庫中的所有函數(shù)都是nids_開頭的。

      關(guān)于“C/C++中名字空間與作用域的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

      另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站www.cdcxhl.com,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


      當前題目:C/C++中名字空間與作用域的示例分析-創(chuàng)新互聯(lián)
      網(wǎng)頁路徑:http://ef60e0e.cn/article/degpis.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        嘉义市| 米泉市| 临漳县| 朝阳区| 盘山县| 灌南县| 莱西市| 扬州市| 安仁县| 永善县| 淮安市| 吉安市| 香格里拉县| 武义县| 恭城| 肃北| 卫辉市| 图木舒克市| 南城县| 横山县| 祁连县| 诸城市| 来安县| 岱山县| 邮箱| 武功县| 永寿县| 日照市| 平度市| 上虞市| 萨迦县| 徐闻县| 维西| 灵石县| 新乐市| 南澳县| 阿克| 枝江市| 鲁甸县| 安康市| 庄河市|