程式環境
1.翻譯環境: 編譯+鏈結
先將組成乙個程式的每個原始檔通過編譯轉換成目標檔案,再將每個目標檔案通過編譯器**在一起鏈結成乙個
可執行檔案
翻譯過程:
1.預處理(c->c): 標頭檔案展開,巨集替換,去注釋,條件編譯
2.編譯(c->彙編)
3.彙編(彙編->二進位制)
4.鏈結
常見的鏈結方式:
2.執行環境
預處理
預定義符號
__file__//源檔名 %s
__function__//函式名 %s
#define
巨集引數中可以出現其他巨集定義的變數,但不能出現遞迴
當預處理器搜尋#define定義的符號時,字串常量的內容不被搜尋
*相鄰的字串具有自動連線的特性
只有當字串作為巨集引數的時候才可以把字串放在字串中
#和##
使用#,把乙個巨集引數變成對應的字串
#define print(f,v) printf("the value of "#v" is "f"\n",v)
int main()
使用##,把位於它兩邊的符號合成乙個符號
#define add_to_sum(index,value) sum##index+=value
int main()
巨集和函式巨集優點:
巨集函式效率高,簡單的文字替換,不需要呼叫和釋放
巨集與型別無關,函式引數傳參必須有特定的型別
缺點:可能大幅度增加**的冗餘度
巨集無法除錯
巨集與型別無關,不夠嚴謹
巨集可能會帶來運算子優先順序問題
*巨集的引數可以出現型別
#define malloc(num,type) (type*)malloc(num*sizeof(type))
int main()
例題:
將乙個數字的奇數字和偶數字交換
條件編譯1.#pragma once
2.#ifndef __test_h__
#define __test_h__
#endif //__test_h__
程式環境和預處理
一 程式的編譯環境和執行環境 1 每乙個程式的原始檔都會通過編譯過程轉換為相應的目標 2 每乙個目標 由鏈結器 在一起,形成乙個單一的可執行程式。3 鏈結器同時也會引入標準庫函式中被程式任意引用的庫函式,而且還可以搜尋程式設計師的個人程式庫,將需要的函式也鏈結到程式之中。編譯分為幾個階段組成 程式執...
程式環境和預處理
翻譯環境中源 被轉換為可執行的機器命令。預編譯 預處理指令。標頭檔案的包含,注釋刪除,define處理。相當於根據預處理指令組裝新的c c 程式。經過預處理,會產生乙個沒有標頭檔案 都已經被展開了 巨集定義 都已經替換了 沒有條件編譯指令 該遮蔽的都遮蔽掉了 沒有特殊符號的輸出檔案,這個檔案的含義同...
程式環境和預處理
一 程式環境那麼,就會有人問了,為什麼不直接將c語言轉換成二進位制呢?這就要從c語言的發展來說起了。起初,是沒有程式語言的,有的只是紙段,紙段上打眼來編寫程式,放入計算機中來計算,這種方法往往效率低並且計算複雜。而後,有了組合語言,人們拜託了紙段的束縛。但是,人們嫌組合語言還是不夠精簡,也就是使用複...