一、程式的編譯環境和執行環境
(1)、每乙個程式的原始檔都會通過編譯過程轉換為相應的目標**。
(2)、每乙個目標**由鏈結器**在一起,形成乙個單一的可執行程式。
(3)、鏈結器同時也會引入標準庫函式中被程式任意引用的庫函式,而且還可以搜尋程式設計師的個人程式庫,將需要的函式也鏈結到程式之中。
編譯分為幾個階段組成:
程式執行的過程:
(1)、程式必須載入到記憶體中。
(2)、函式的執行開始,接著就呼叫main()函式
(3)、開始執行程式**。這時函式需要使用乙個執行時堆疊,儲存函式的區域性變數和返回位址。程式同時也可以使用靜態記憶體,儲存在靜態記憶體中的變數在程式執行的整個過程中就一直保留它們的值。
(4)、終止程式,可能正常終止main()函式,也可能異常終止。
二、預處理器詳解
以上這些符號都是語言內建的,可以直接使用。
1、#define 定義識別符號
eg:在define定義識別符號的時候不要加上;很容易會導致錯誤。
2、#define 定義巨集
parament-list使用,隔開的符號表,引數列表的左括號必須要與name緊挨,否則引數列表就會被解釋為stuff中的一部分。
eg #define add(x) x+x
注意:在用於數值表示式求值的巨集定義一定要加上括號,為了避免在使用巨集時由於引數中的操作符和鄰近操作符之間不可預料的相互作用。
(1)、呼叫巨集時,首先對引數進行檢查,看看是否包含任何由#define定義的符號,如果有,應該首先替換。
(2)、替換文字後被插入帶文字原來的位置,對於巨集,函式名被他們替換。
(3)、最後,再次對結果檔案進行掃瞄,看它是否包含由#define定義的符號。
3、#與##
使用#,可以將乙個巨集引數變成對應的字串
#define print(format,value)\
printf("the value of "
#value" is "format"\n");
int i = 10;
int main()
#define cat(x,y) x##y
int main()
4、巨集和函式
巨集和函式的優缺點:
5、條件編譯
具體實現為:
#include
#include
#define _degug_ 0
int main()
; for (i = 0; i < 10; i++)
system("pause");
return
0;}
表示如果被定義了就執行其中的語句,如果沒有定義就不執行
printf(「hehe\n」);
#endif
如果條件為真則參加編譯,如果條件為假就不參與編譯
printf("hehe");
避免標頭檔案的重複使用
//標頭檔案的內容
程式環境和預處理
程式環境 1.翻譯環境 編譯 鏈結 先將組成乙個程式的每個原始檔通過編譯轉換成目標檔案,再將每個目標檔案通過編譯器 在一起鏈結成乙個 可執行檔案 翻譯過程 1.預處理 c c 標頭檔案展開,巨集替換,去注釋,條件編譯 2.編譯 c 彙編 3.彙編 彙編 二進位制 4.鏈結 常見的鏈結方式 2.執行環...
程式環境和預處理
翻譯環境中源 被轉換為可執行的機器命令。預編譯 預處理指令。標頭檔案的包含,注釋刪除,define處理。相當於根據預處理指令組裝新的c c 程式。經過預處理,會產生乙個沒有標頭檔案 都已經被展開了 巨集定義 都已經替換了 沒有條件編譯指令 該遮蔽的都遮蔽掉了 沒有特殊符號的輸出檔案,這個檔案的含義同...
程式環境和預處理
一 程式環境那麼,就會有人問了,為什麼不直接將c語言轉換成二進位制呢?這就要從c語言的發展來說起了。起初,是沒有程式語言的,有的只是紙段,紙段上打眼來編寫程式,放入計算機中來計算,這種方法往往效率低並且計算複雜。而後,有了組合語言,人們拜託了紙段的束縛。但是,人們嫌組合語言還是不夠精簡,也就是使用複...