外部鏈接c語言,c++內部鏈接和外部鏈接的區別

本文目錄一覽:

c語言中的連接是什麼意思

c語言中的連接指de是將obj文件生成為exe文件。

##可以作為連接字符串的連接符,##為宏擴展提供了一種連接實際變元的。如果替換文本中的參數用##相連,那麼參數就被實際變元替換,##與前後的空白符被刪除,並對替換後的結果重新掃描。

例如,下面定義的宏paste用於連接兩個變元:

#definepaste(front,back)front##back

從而宏調用paste(name,1)的結果是建立單詞name1。

擴展資料

C語言連接符的使用:

#includestdio.h

#defineOperations(x)operation_##x//##是黏貼字符串

intOperations(sum)(intx,inty){//operation_sum(intx,inty)

returnx+y;

}

intOperations(sub)(intx,inty){//operation_sub(intx,inty)

returnx-y;

}

intOperations(mul)(intx,inty){//operation_mul(intx,inty)

returnx*y;

}

floatOperations(div)(floatx,floaty){//operation_div(intx,inty)

floatresult;

result=x/y;

returnresult;

}

#definePrint(x)printf(“%s,%d\n”,#x,x);//#表示將參數轉變為字符串

intmain()

{

intx;

floaty;

x=Operations(sum)(10,20);

printf(“x=%d\n”,x);

x=operation_sum(100,20);

printf(“x=%d\n”,x);

x=Operations(sub)(10,20);//operation_sub(10,20)也可以

printf(“x=%d\n”,x);

x=Operations(mul)(10,20);//operation_mul(10,20)也可以

printf(“x=%d\n”,x);

y=Operations(div)(11,20);//operation_div(11,20)也可以

printf(“y=%lf\n”,y);

Print(100);

return0;

}

c/c++中的標識鏈接有幾種方式 外部鏈接 內部鏈接

當一個實現文件(.cpp …)編譯時,預處理器(CPP)首先遞歸的包含頭文件,形成一個保含有所有必要信息的單個源文件. 這個源文件稱為 編譯單元.

內部連接 如果一個名稱對於它的編譯單元來說是局部的, 並且在連接的時候不可能與其它編譯單元中的同樣的名稱相衝突,則這個名稱具有內部連接.即具有內部連接的名稱不會被帶到目標文件中.

外部連接 在一個多文件程序中,如果一個名稱在連接時可以和其他編譯單元交互,那麼這個名稱就具有外部連接. 即具有外部連接的名稱會引入到目標文件中,由連接程序進行處理.這種符號在整個程序中必須是惟一的.

具有內部連接的定義包括:

具有外部連接的定義包括:

聲明本身不會將任何符合引入目標文件,所以聲明都是內部連接的.

某些聲明可以激活對一個外部連接定義的訪問,也許我們會很隨便的說這些聲明具有外部連接,如:

int f();

extern int i;

class Point { static int s_numPoints; … }; /* 類靜態數據成員聲明具有外部連接, 該數據必須在另一個地方被定義,如: point.c int Point::s_numPoints; */

還有一些聲明即不把什麼符號引入目標文件,也不能用來激活對外部連接定義的訪問,我們常常稱這類聲明具有內部連接,

typedef int INT;

class Point;

struct Point;

把一個帶有外部連接的定義放在 .h 文件中都會引起錯誤.由於類的聲明和定義都是內部連接的,一般都放在 .h 文件中.

非內聯的類成員函數.如: Point Point::operator+=(const Point right) { … }

非內聯,非靜態的自由函數. 如: Point operator+(const Point left, const Point right) { … }

非靜態的全局定義.

加 static 前綴的全局變量定義.如: static int x;

枚舉類型的定義.如: enum Boolean {NO,YES };

類的定義. 如: class Point { int d_x; int d_y; … };

內聯函數的定義.如: inline int operator==(const Point left,const Pointright) { … }

union的定義.

名字空間中const常量定義

特別說明:

C++規定,有const修飾的變量,不但不可修改,還都將具有內部鏈接屬性,也就是只在本文件可見。(這是原來C語言的static修飾字的功能,現在const也有這個功能了。)又補充規定,extern const聯合修飾時,extern將壓制const這個內部鏈接屬性。於是,extern char const s[]將仍然有外部鏈接屬性,但是還是不可修改的。 具體使用方法如下:

在cpp文件中:extern const int a=1;

在要使用該常量的cpp文件中:extern const int a;//也可以將其放到頭文件中

coutaendl;

當用extern修飾const變量將強製為其分配內存,因為extern表示採用外部鏈接,因此其必須有某個地址保存其值。

C語言裡面”具有外部鏈接的靜態變量”這裡的”鏈接”是什麼意思?

首先從靜態變量說起. C語言裡面靜態變量有三種: 分別是外部鏈接性,內部鏈接性和無鏈接性.

聲明外部鏈接的變量的方法是在代碼塊外面聲明它. 此變量是全局變量,多文件中亦可用.

聲明內部鏈接的變量的方法是在代碼塊外面聲明它並加上static限定符. 此變量是全局變量,但僅在本文件中可用.

聲明無鏈接的變量的方法是在代碼塊裡面聲明它並加上static限定符. 此變量是局部變量,但僅在本代碼塊中可用.

例:

#include………..

int global=1; //聲明外部鏈接的變量

static int global2 //聲明內部鏈接的變量

int func()

{

int global=5; //聲明的內部變量和全局變量重名,調用時將會隱藏全局的global;

coutglobal; //是內部定義的global的值而不是外面的值.

//如何引用外面的變量呢???

cout::global; //可用作用域解析符(::)來說明你要輸出的外面的全局變量.

static int global3; //聲明無鏈接的變量

}

int main()

{

extern int alobal; //在本文件中此句可選.此句的意思為你需要引用外部的變量global;

global=8; //直接引用全局變量.

}

望採納!!!!

什麼事內部鏈接和外部鏈接,什麼事空鏈接

C語言中的變量分為外部鏈接、內部鏈接、空連接三種:

(1)外部鏈接:外部鏈接的變量可以在多個文件中使用;

(2)內部鏈接:內部鏈接的變量只能在一個文件中使用;

(3)空鏈接:由定義變量的代碼塊作用域所私有;

文件作用域變量前面加關鍵字static就是內部鏈接,表明該變量為定義該變量的文件私有。

c語言調用外部函數連接不了

你必須用include包括file1和file2否則雖然你用extern告訴編譯器有這兩個函數,能通過編譯,但是實際上編譯器並不知道這兩個文件在哪,所以會出錯

關於c語言中變量有外部鏈接內部鏈接和無 鏈接怎麼理解?

這部分內容是在程序的編譯和link層面談的。

一個大一些的工程往往不是只有一個程序文件,經常由好多C程序文件構成,有的時候裡面個別程序可能還用的其他語言,編碼完成後常常分別編譯,編譯完成再link到一起。某個C程序需要用到其他程序中定義過的變量,一般都加extern前綴,編譯時編譯器會預留訪問鏈接的空位,等到link階段再在整個工程的其他C編譯結果中去對號,把訪問鏈接填上。這就是外部鏈接。如果你程序全寫在一個文件里,那永遠都不會有外部鏈接。

內部鏈接常指一個程序文件中全局變量,可以被程序文件內各個子程序訪問,這在編譯過程中處理,和link階段不發生關係。如果變量前加了static,那麼它永遠不會被外部程序訪問,它不會被編譯程序寫入目標代碼的鏈接區。

無鏈接,就是在一個單體程序里,比如一個子程序,定義一個變量只給這個程序段用,那就是無鏈接。編譯器和link都不需要對這樣的變量做跨程序段的地址鏈接,這樣的變量都是直接分配寄存器或者近堆中的直接地址(每個子程序都有自己的基本存儲空間,被調用時得到分配,返回時被釋放,我習慣叫它近堆,標準叫啥早不記得了)。

變量是這樣,程序代碼段也大體差不多。每次在程序文件中調用一個文件內部的子程序,就產生一個內部鏈接;如果調用外部文件中的子程序,就產生一個外部鏈接。只有沒有任何子程序,所有代碼都寫在一個文件里的程序,才是無鏈接程序。

鏈接是個編譯和link層面的概念,所以不僅限於變量層面討論。

對了,再延伸,可以把一些子程序文件歸類,程序執行某部分任務才訪問,其他時間不訪問時,可以生成DLL。在程序執行那部分功能時,通過操作系統和DLL建立動態鏈接,當然這是外部鏈接,這也是程序設計中常用到的。這可以避免生成一個巨大的EXE,運行時吃掉過多的系統資源,還可以實現這個DLL中包含的子程序在操作系統級和其他程序共用。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/193089.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-01 10:32
下一篇 2024-12-01 14:59

相關推薦

  • Python中new和init的區別

    new和init都是Python中常用的魔法方法,它們分別負責對象的創建和初始化,本文將從多個角度詳細闡述它們的區別。 一、創建對象 new方法是用來創建一個對象的,它是一個類級別…

    編程 2025-04-29
  • AES加密解密算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES算法,並對實現過程進…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演着非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Sublime Test與Python的區別

    Sublime Text是一款流行的文本編輯器,而Python是一種廣泛使用的編程語言。雖然Sublime Text可以用於編寫Python代碼,但它們之間有很多不同之處。接下來從…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • Shell腳本與Python腳本的區別

    本文將從多個方面對Shell腳本與Python腳本的區別做詳細的闡述。 一、語法差異 Shell腳本和Python腳本的語法存在明顯差異。 Shell腳本是一種基於字符命令行的語言…

    編程 2025-04-29
  • Python中while語句和for語句的區別

    while語句和for語句是Python中兩種常見的循環語句,它們都可以用於重複執行一段代碼。然而,它們的語法和適用場景有所不同。本文將從多個方面詳細闡述Python中while語…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29
  • Web程序和桌面程序的區別

    Web程序和桌面程序都是進行軟件開發的方式,但是它們之間存在很大的區別。本文將從多角度進行闡述。 一、運行方式 Web程序運行於互聯網上,用戶可以通過使用瀏覽器來訪問它。而桌面程序…

    編程 2025-04-29
  • Python按位運算符和C語言

    本文將從多個方面詳細闡述Python按位運算符和C語言的相關內容,並給出相應的代碼示例。 一、概述 Python是一種動態的、面向對象的編程語言,其按位運算符是用於按位操作的運算符…

    編程 2025-04-29

發表回復

登錄後才能評論