㈠ 關於c語言中變數有外部鏈接內部鏈接和無 鏈接怎麼理解
這部分內容是在程序的編譯和link層面談的。
一個大一些的工程往往不是只有一個程序文件,經常由好多C程序文件構成,有的時候裡面個別程序可能還用的其他語言,編碼完成後常常分別編譯,編譯完成再link到一起。某個C程序需要用到其他程序中定義過的變數,一般都加extern前綴,編譯時編譯器會預留訪問鏈接的空位,等到link階段再在整個工程的其他C編譯結果中去對號,把訪問鏈接填上。這就是外部鏈接。如果你程序全寫在一個文件里,那永遠都不會有外部鏈接。
內部鏈接常指一個程序文件中全局變數,可以被程序文件內各個子程序訪問,這在編譯過程中處理,和link階段不發生關系。如果變數前加了static,那麼它永遠不會被外部程序訪問,它不會被編譯程序寫入目標代碼的鏈接區。
無鏈接,就是在一個單體程序里,比如一個子程序,定義一個變數只給這個程序段用,那就是無鏈接。編譯器和link都不需要對這樣的變數做跨程序段的地址鏈接,這樣的變數都是直接分配寄存器或者近堆中的直接地址(每個子程序都有自己的基本存儲空間,被調用時得到分配,返回時被釋放,我習慣叫它近堆,標准叫啥早不記得了)。
變數是這樣,程序代碼段也大體差不多。每次在程序文件中調用一個文件內部的子程序,就產生一個內部鏈接;如果調用外部文件中的子程序,就產生一個外部鏈接。只有沒有任何子程序,所有代碼都寫在一個文件里的程序,才是無鏈接程序。
鏈接是個編譯和link層面的概念,所以不僅限於變數層面討論。
對了,再延伸,可以把一些子程序文件歸類,程序執行某部分任務才訪問,其他時間不訪問時,可以生成DLL。在程序執行那部分功能時,通過操作系統和DLL建立動態鏈接,當然這是外部鏈接,這也是程序設計中常用到的。這可以避免生成一個巨大的EXE,運行時吃掉過多的系統資源,還可以實現這個DLL中包含的子程序在操作系統級和其他程序共用。
㈡ 編譯之後為什麼要連接
這是一個編程基礎的問題。
目前編程語言主要有兩種類型,一種是編譯型語言,一種是解釋型語言。二者的區別在於:編譯型語言需要編譯、鏈接生成可執行文件之後才能運行,解釋型語言直接就可以運行。C語言是一種編譯型語言。
對於計算機來說,只能運行二進制的機器指令。為了方便編寫指令給計算機,通過簡單的替換之後有了匯編語言。但是匯編語言相對來說還是相當復雜,編寫軟體時工作量巨大。所以就有了如C語言,C++,JAVA之類的高級語言。
這些語言其實是對匯編做了抽象封裝。編譯這個動作就是將C語言翻譯成了匯編。C語言經過編譯這個動作後每個.C文件都會生成一個OBJ,鏈接這個動作是將多個OBJ鏈接到同一個可執行文件中,最後生成的是EXE文件。
㈢ 編寫代碼時,源代碼必須經過編譯和鏈接生成目標代碼,請問什麼是鏈接
鏈接是將編譯生成的目標代碼鏈接成可執行代碼,鏈接時會將需要調用的庫函數和目標文件一起鏈接成可執行代碼
㈣ C語言編輯編譯連接的作用是什麼
C語言編輯的作用是檢查語法,製作C語言的源文件和頭文件,生成匯編代碼。
C語言編輯的作用是將匯編代碼轉換機器碼。在這一步中,會對文件內部的語法語義做處理,如果編譯出錯,無法進行後續動作。
C語言鏈接的作用是將機器碼鏈接到一起生成可執行程序。這一步會對文件之間的關聯做檢查,如果出錯,將不會生成可執行程序,也就無法執行。
(4)編譯時的鏈接是什麼意思擴展閱讀:
C語言鏈接時,將源文件中用到的庫函數與匯編生成的目標文件.o合並生成可執行文件。該可執行文件會變大很多,一般是調用自己電腦上的靜態庫。
靜態庫和應用程序編譯在一起,在任何情況下都能運行,而動態庫是動態鏈接,文件生效時才會調用。很多代碼編譯通過,鏈接失敗就極有可能在靜態庫和動態庫這出現了紕漏,要視情況解決。缺少相關所需文件,就會鏈接報錯。這個時候就要檢查下本地的鏈接庫是不是缺損。
㈤ c語言中的編輯,編譯,連接,運行分別是什麼意思
1、編輯:編寫代碼,製作C語言的源文件。
2、編譯:是由編譯程序將C語言源文件轉換成二進制中間文件,對文件內部的語法語義做處理,如果編譯出錯,無法進行後續動作。
3、鏈接:將編譯中生成的中間文件組合成二進制可執知行文件,這一步會對文件之間的關聯做檢查,如果出錯,將不會生成可執行文件,也就無法執行。
4、執行:運行可執行文件,這一步道是編寫代碼的最終目的。
(5)編譯時的鏈接是什麼意思擴展閱讀:
DOS命令通常分為三類:內部命令、外部命令和批處理命令。
1、內部命令:
其包含在命令解釋程序COMMAND.COM中,一旦啟動DOS,這些命令就被調入內存,只要在DOS系統提示符下輸入這些命令,就可立即執行。
2、外部命令:
其以文件的形式存儲在系統盤上,所帶擴展名為COM和EXE。DOS啟動時,它們並沒有被調入內存,執行前必須從系統盤讀進內存。因此輸入外部命令時,要了解該命令是否在當前盤上,不然DOS無法找到它們。
3、批處理命令:
實際上是個文件,該文件包含多條命令,當用戶鍵入批處理文件名時,DOS將順序執行其中的各條命令。注意,批處理命令必須用「.BAT」作為擴展名。
C語言的運算非常靈活,功能十分豐富,運算種類遠多於其它程序設計語言。在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單。
當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則就會顯得十分重要。
網路-運行命令
網路-C語言
㈥ 什麼是程序編輯,編譯,連接
編輯就是寫代碼,編寫程序。
編譯就是將高級語言轉換成機器能識別的語言。
鏈接就是找程序運行是依賴的庫文件等。
㈦ 什麼叫編譯,什麼又叫鏈接
編譯就是將源程序翻譯為機器代碼,機器代碼一般以*.obj文件保存。
鏈接就是將上一步產生的obj文件與操作系統動態庫組合為可執行的exe文件。
㈧ c語言中的連接是什麼意思
c語言中的連接指de是將obj文件生成為exe文件。
##可以作為連接字元串的連接符,##為宏擴展提供了一種連接實際變元的。如果替換文本中的參數用##相連,那麼參數就被實際變元替換,##與前後的空白符被刪除,並對替換後的結果重新掃描。
例如,下面定義的宏paste用於連接兩個變元:
#definepaste(front,back)front##back
從而宏調用paste(name,1)的結果是建立單詞name1。
(8)編譯時的鏈接是什麼意思擴展閱讀
C語言連接符的使用:
#include<stdio.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 ",#x,x);//#表示將參數轉變為字元串
intmain()
{
intx;
floaty;
x=Operations(sum)(10,20);
printf("x=%d ",x);
x=operation_sum(100,20);
printf("x=%d ",x);
x=Operations(sub)(10,20);//operation_sub(10,20)也可以
printf("x=%d ",x);
x=Operations(mul)(10,20);//operation_mul(10,20)也可以
printf("x=%d ",x);
y=Operations(div)(11,20);//operation_div(11,20)也可以
printf("y=%lf ",y);
Print(100);
return0;
}