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

深入理解C++內(nèi)鏈接與外鏈接的意義

 更新時間:2021年11月17日 09:56:22   作者:Jerish_C  
鏈接描述了名稱在整個程序或一個翻譯單元中如何引用或不引用同一實體,下面這篇文章主要給大家介紹了關于C++內(nèi)鏈接與外鏈接意義的理解,需要的朋友可以參考下

上一篇博客給大家解釋了“程序運行鏈接”的概念與意義,并區(qū)分了動態(tài)鏈接庫與靜態(tài)鏈接庫。接下來想和大家談一下C++的內(nèi)鏈接與外鏈接的區(qū)別與意義??赐曛?,希望你能理解以下幾個問題~

1.      為什么不要在頭文件中定義具有外部鏈接的實體?

2.      在頭文件中定義具有內(nèi)部鏈接的實體有什么劣勢?

3.      內(nèi)部鏈接與外部鏈接存在的意義是什么?

首先理解什么是編譯單元?

我們知道,其實編譯器在編譯代碼時,只會去編譯.cpp格式的源文件,并且預編譯器會遞歸的把.cpp所有#include的頭文件都“拷貝”到.cpp文件中去,之后對這個文件再進行編譯,生成二進制的.obj文件。那么其實每一個.cpp文件都是一個編譯單元。

聲明與定義

一個聲明將一個名稱引入一個作用域,C++中在同一個作用域中可以重復聲明,除了類中的成員函數(shù)與成員變量的聲明。以下都是聲明:

Extern int number; //外部引用聲明

Typedef int  int32; // typedef聲明

Class A;          //類的前置聲明

Using std::cin;   //名字空間引用聲明

Friend f;         //友元聲明

Int testFun();    //函數(shù)前置聲明

定義決定了一個實體在一個作用域的唯一描述,同一作用域不可以重復定義一個實體。以下都是定義:

Int a;

Class Myclass{…};

Myclass ma;

Static int b;

Enum{first, second,third};

Const int m = 2;

Void hello(){…}

什么是內(nèi)部鏈接?

如果一個名稱對于他的編譯單元是局部的,并且在鏈接時不會與其他的編譯單元中同樣的名字沖突,那么這個名稱就擁有內(nèi)部鏈接。這個實體有內(nèi)部鏈接,他就不會與其他.cpp文件同名的實體沖突。換個說法,那些編譯單元(.cpp)中不能向其他編譯單元(.cpp)展示提供其定義的函數(shù)、變量就擁有內(nèi)部鏈接

那么哪些實體擁有內(nèi)部鏈接?

1.      靜態(tài)(static)全局變量,自由函數(shù),友元函數(shù)定義

2.      類的定義

3.      內(nèi)聯(lián)函數(shù)定義

4.      Union共用體定義

5.      名字空間的const常量定義

6.      枚舉類型定義

7.      所有的聲明(有人將聲明歸結為無鏈接)

什么是外部鏈接?

一個多文件的程序中,一個實體可以在鏈接時與其他編譯單元交互,那么這個實體就擁有外部鏈接。

換個說法,那些編譯單元(.cpp)中能想其他編譯單元(.cpp)提供其定義,讓其他編譯單元(.cpp)使用的函數(shù)、變量就擁有外部鏈接

那么哪些實體擁有外部鏈接?

1.      類的非內(nèi)聯(lián)函數(shù)(包括成員函數(shù)和靜態(tài)類成員函數(shù))的定義

2.      類的靜態(tài)成員變量的定義

3.      名字空間或全局的非靜態(tài)的自由函數(shù),非靜態(tài)變量,非友元函數(shù)的定義

那么這里總結一下,定義這樣的內(nèi)鏈接與外鏈接有什么意義?

所謂鏈接,就是因為項目工程的不斷擴大,寫在一個.cpp文件即難以維護,又不好去合作開發(fā)。所以去將代碼按照比較有條理的,分成多個文件,讓其可以獨立編譯,在最后運行在整合到一起,也就是通過鏈接再去找到需要的代碼。這時候就需要外鏈接定位到合適的代碼。

比如我們定義的全局函數(shù)和變量,可以跨模塊的鏈接使用。

有一些名字定義所表示的實體擁有外部鏈接,這樣就意味著他可以跨越編譯單元去進行代碼的鏈接。所以,擁有外部鏈接的實體如果被聲明在頭文件并且被多個.cpp文件包含,可能就會出現(xiàn)鏈接沖突錯誤,因為每個包含這個擁有外部鏈接實體的.cpp都會分配空間,當多個編譯單元鏈接的時候,連接器就會面對多個相同的名字,無法正常鏈接到正確的對象。

下面舉個例子:(VS2012環(huán)境下)

//lesson.h

namespace lesson

{
         int  test;

}

//lesson.cpp

#include "stdafx.h"

#include "lesson.h"

int _tmain(intargc,_TCHAR*argv[])

{
         system("pause");

         return0;

}

//test.cpp

#include "lesson.h"

我們就會看到

error LNK2005: "intlesson::test" (?test@lesson@@3HA) 已經(jīng)在 lesson.obj 中定義C:\Users\user\Documents\Visual Studio 2012\Projects\lesson\lesson\stdafx.obj

這樣的錯誤提示。

而對于擁有內(nèi)部鏈接的實體則不會出現(xiàn)這樣的情況,因為他不會與其他.cpp的同名實體產(chǎn)生沖突。比如我們將上面的lesson.h改為

//lesson.h

class lesson

{
         int  test;

}

這樣就不會有任何錯誤,因為類的定義是有內(nèi)部鏈接的。

如果在lesson.h里面再定義靜態(tài)變量,枚舉類,進行各種聲明等,這些實體由于有內(nèi)部鏈接所以仍然是合法的,編譯器會認為你想在各個編譯單元中都有一個私有的副本。

那么進一步的概括這些內(nèi)容就是一句話  

相同作用域內(nèi)的聲明可以有多個,但是只能定義一次。

先不考慮內(nèi)鏈接還是外鏈接,我們都知道一個{}里面不可能定義兩個一模一樣的名字。對于一個單獨的.cpp文件,我們是知道的,但是對于多個文件,好像就稍微有點暈。其實,這是一個道理,我們的外部鏈接就是讓各個.cpp文件能鏈接到一起,這樣在.cpp文件遇到第一個{}之前,他們的作用域就可以理解為相同的,所以擁有外部鏈接的實體(全局函數(shù),變量等)出現(xiàn)在第一個{}之前,而且名字相同,那就是出現(xiàn)了定義重復的錯誤。

我們再看,所有的聲明都是有內(nèi)部鏈接的,然而他其實可以鏈接到其他文件,因為他的定義是在其他的編譯單元的,所以多個編譯單元擁有相同的聲明也是合理的。但是,我們知道,這個聲明對應的定義肯定只有一個。

最后再給出一個C++編程建議,慎重考慮在頭文件中定義有鏈接的實體

一,如果頭文件是像int a=1;這樣的定義,被包含在多個.cpp文件后肯定會報出鏈接錯誤。

二,如果是想static int a = 2;這樣的定義就會在所有包含他的.cpp文件中生成一個副本,如果被大量源文件include的話,就會占據(jù)大量的空間,造成內(nèi)存浪費。

總結

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

相關文章

  • 詳解C語言內(nèi)核字符串轉換方法

    詳解C語言內(nèi)核字符串轉換方法

    在內(nèi)核開發(fā)模式下,初始化字符串也需要調(diào)用專用的初始化函數(shù),如下分別初始化ANSI和UNCODE字符串,本文我們就來看看代碼是如何實現(xiàn)的
    2022-09-09
  • C++11如何引入的尾置返回類型

    C++11如何引入的尾置返回類型

    C++11 標準引入的尾置返回類型,可以讓返回復雜類型的函數(shù)聲明更加清晰易讀,在無法使用C++14 標準的情況下,通過尾置返回類型的語法來推導函數(shù)模板的返回類型無疑是最簡便的方法,這篇文章主要介紹了C++11引入的尾置返回類型,需要的朋友可以參考下
    2023-01-01
  • C++引用和結構體介紹

    C++引用和結構體介紹

    這篇文章主要介紹了C++引用和結構體,結構體是我們自定義的復合類型,本質上也是一種變量類型,所以一樣可以使用引用,下面來看看文章內(nèi)容詳細介紹,需要的朋友可以參考一下
    2021-11-11
  • Qt Design Studio安裝圖文教程

    Qt Design Studio安裝圖文教程

    本文主要介紹了Qt Design Studio安裝圖文教程,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • C/C++ Windows SAPI實現(xiàn)文字轉語音功能

    C/C++ Windows SAPI實現(xiàn)文字轉語音功能

    本文通過封裝Windows SAPI(Speech Application Programming Interface),提供了一個現(xiàn)代化的C++接口實現(xiàn)文字轉語音功能,這篇文章重點給大家介紹C/C++ Windows SAPI自實現(xiàn)文字轉語音功能,感興趣的朋友一起看看吧
    2025-02-02
  • C語言全面細致精講關鍵字的使用

    C語言全面細致精講關鍵字的使用

    關鍵字是C語言非常重要的一部分,熟練的掌握和使用關鍵字有助于我們更加熟悉了解C語言,同時C語言的關鍵字也是面試筆試中??嫉膬?nèi)容。C語言的關鍵字共有32個,但并不是每個關鍵字都有坑,本篇文章將通過理論聯(lián)系實際的方式為大家講解C語言中易混易錯以及常考的一些關鍵字
    2022-05-05
  • Qt跨平臺窗口選擇功能的實現(xiàn)過程

    Qt跨平臺窗口選擇功能的實現(xiàn)過程

    很多時候為了方便軟件的使用,我們需要讓編寫的界面程序顯示在最上層,這時候就需要對窗口屬性進行調(diào)整,下面這篇文章主要給大家介紹了關于Qt跨平臺窗口選擇功能的實現(xiàn)過程,需要的朋友可以參考下
    2022-12-12
  • 關于C++的強制類型轉換淺析

    關于C++的強制類型轉換淺析

    C++的強制類型轉換是我們在日常開發(fā)中經(jīng)常會遇到的,下面這篇文章主要給大家介紹了關于C++強制類型轉換的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧。
    2017-09-09
  • C++中類的轉換函數(shù)你了解嗎

    C++中類的轉換函數(shù)你了解嗎

    這篇文章主要為大家詳細介紹了C++中類的轉換函數(shù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • 解決codeblocks致命錯誤:openssl/aes.h:沒有這樣的文件或目錄問題

    解決codeblocks致命錯誤:openssl/aes.h:沒有這樣的文件或目錄問題

    這篇文章主要介紹了解決codeblocks致命錯誤:openssl/aes.h:沒有這樣的文件或目錄問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06

最新評論

同江市| 桦甸市| 绥宁县| 伊金霍洛旗| 贵定县| 永吉县| 宝山区| 庄河市| 漳平市| 太康县| 民县| 旺苍县| 名山县| 精河县| 营山县| 宁国市| 万安县| 瓦房店市| 吴江市| 恭城| 荣昌县| 江陵县| 嘉兴市| 会宁县| 阿拉尔市| 临邑县| 乌苏市| 柘荣县| 咸阳市| 锦州市| 江安县| 海阳市| 禄丰县| 安福县| 达孜县| 中牟县| 正安县| 成安县| 桦川县| 三明市| 崇左市|