標籤:style blog http color io ar 使用 strong sp
我第一個C程式 frist.c
1 2 3 4 5 6 7 |
? |
#include?<stdio.h>
int?main(void) { ????printf("這是第一個C程式!\n"); ????return?0; } |
?
一、程式解釋
第一行#include?<stdio.h> 這是一個預先處理命令列
include是一個預先處理命令,意思是包含一個檔案到當前檔案
預先處理命令列都是以"#"開頭
<stdio.h> 指的standard input output 標準的輸入輸入
".h"指標頭檔(header files)主要包含函數的聲明,宏定義等,這個檔案主要包含以下輸入輸出的函數
<>指在系統路徑下尋找這個檔案,也可以替換為"stdio.h",指先在使用者目錄尋找,然後再在系統目錄尋找這個檔案
第二行空白行,為分割主要代碼和前面的預先處理,使代碼看著更有組織
第三行int?main(void) 這是C的主函數是函數的首部,所有C程式都是從這個函數開始執行,而且每個程式有且只能有一個main的定義。int 表示main函數的傳回值是int(整型),void說明這個main函數沒有參數。一個函數可以沒有參數但是後面的"()"小括弧不能省略。
第三行和第七行一對花括弧 "{}"這個表示函數體,其中的內容為函數實現代碼部分
第四行 printf("這是第一個C程式!\n"); 這句意思是調用printf函數在標準輸出裝置(螢幕)上輸出"這是第一個C程式!\n"這句話,最後的\n意思是斷行符號,輸出會換行。
第六行return?0;主函數返回一個0.主函數一般有作業系統調用執行,返回給作業系統一個0表示程式成功執行完成。
二、預先處理
????編譯前預先處理程式根據預先處理命令對C原始碼做一個初步處理,主要有宏替換、條件編譯和檔案包含。
在windows平台下可以使用VC的編譯器程式cl(直接使用cl命令需要在環境變數中添加cl路徑),在命令列下輸入 cl /P first.c 會成一個first.i檔案,這個就是預先處理後的檔案。開啟這檔案在最後會發現我們的代碼,這int main(void)之前多出很多代碼。主要就是把stdio.h這檔案包含了進來。
在linux下使用 gcc -E first.c -o first.i 命令可以查看預測到first.i中的結果。也是多了很多代碼,但是明顯和windows下的不一樣,這說明不同的預先處理程式處理的結果是不同的,除了包含stdio.h這個檔案外還會添加自己的一些東西。
三、編譯
將原始碼轉為組合語言,最佳化也在這一階段處理。最佳化選項可查看程式協助。
Windows 下 cl /FA first.c 會產生 first.asm、first.obj和first.exe,其中first.asm是編譯後產生的彙編代碼。Cl命令在這一步一次完成了編譯、彙編和串連,貌似沒有單獨編譯為彙編的命令。
Linux 下 gcc -S first.i 會產生 first.s這個彙編檔案。查看first.asm 和first.s他們是不同的。不同的編譯器和不同的平台產生的彙編代碼是不相同的。
四、彙編
????將彙編代碼轉換為機器的二進位語言。在上一步中直接進行了彙編和串連過程。
Linux下gcc -c first.s 則可以產生二進位first.o檔案。
五、連結
將產生的目標檔案,通過link程式連結產生平台可執行檔。Linux上的可執行檔在windows上是不能執行的,反之亦然。可執行檔是由他的檔案結構和許可權決定其是否能夠執行。而不是因為他的副檔名是exe。串連過程需要很多檔案庫檔案,不同平台也不同。Linux使用ld程式,windows使用link程式。具體使用請查看ld和link程式說明。
六、執行
????執行產生的可執行,在螢幕上輸出"這是第一個C程式!"
?
七、其他說明
gcc 和cl產生可執行檔,這個過程並不是單一的gcc和cl完成,而是由多個程式完成的。每個階段都有相應的處理常式。
gcc和cl編譯器有很多選項,可以查看其手冊。
我第一個C程式 frist.c