程式環境和預處理

2021-08-18 03:54:24 字數 1570 閱讀 4925

程式環境

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語言的發展來說起了。起初,是沒有程式語言的,有的只是紙段,紙段上打眼來編寫程式,放入計算機中來計算,這種方法往往效率低並且計算複雜。而後,有了組合語言,人們拜託了紙段的束縛。但是,人們嫌組合語言還是不夠精簡,也就是使用複...