程式環境和預處理

2021-10-12 20:22:38 字數 2311 閱讀 9325

一、程式環境那麼,就會有人問了,為什麼不直接將c語言轉換成二進位制呢?

這就要從c語言的發展來說起了。起初,是沒有程式語言的,有的只是紙段,紙段上打眼來編寫程式,放入計算機中來計算,這種方法往往效率低並且計算複雜。而後,有了組合語言,人們拜託了紙段的束縛。但是,人們嫌組合語言還是不夠精簡,也就是使用複雜,所以才出現了c語言。這就解釋了為什麼從c語言到二進位制語言翻譯的時候,先翻譯成了組合語言,再翻譯成二進位制了。因為歷史是這麼發展的,二進位制->組合語言->c語言,所以從c語言到二進位制也是應該從後到前一步一步來。

二、預處理詳解

1、預定義符號

__file__

//進行編譯的原始檔

__line__

//檔案當前的行號

__date__

//檔案被編譯的日期

__time__

//檔案被編譯的時間

__stdc__ //如果編譯器遵循ansi c,其值為1,否則未定義

這些預定義符號都是語言內建的。舉個例子:

printf

("file:%s line:%d\n"

,__file__

,__line__

);

2、#define

(1)#define定義識別符號

#define name stuff 

//把name替換為stuff

乙個小問題:define定義識別符號的時候,要不要在後面加上「;」?

比如:#define max 1000;,不建議加「;」,因為會報錯,c語言會單純地把1000;都賦給max。

(2)#define定義巨集

#define name(parament-list) stuff 

//其中的parament-list是乙個由符號隔開的符號表,它們可能出現在stuff中。

**注意:**引數列表的左括號必須與name緊鄰。如果兩者之間有任何空白存在,引數列表就會被解釋為stuff的一部分。

如:

#define square(x) x*x
這個巨集接收乙個引數x。如果在上述宣告之後,你把

square(5

)

置於程式中,預處理器就會用下面這個表示式替換上面的表示式:

5

*5

那如果我們輸入:

square(5

+1)

結果會是多少呢?會是36嗎?

答案是11。為什麼呢?因為(5+1)當成了x,就成為了5+1*5+1,按照運算規則,結果就是11。

所以我們要想讓它輸出36,就必須加上小括號。

square

(x)(x)

*(x)

(3)#和##

a.#的作用:把乙個巨集引數程式設計對應的字串。

b.##的作用:可以把位於它兩邊的符號合成乙個符號。它允許巨集定義從分離的文字片段建立識別符號。

(4)巨集和函式的對比

巨集通常用來執行簡單的運算。比如在兩個數中找出較大的乙個:

#define max(a,b) ((a)>(b))?(a):(b))
巨集相對於函式的優點-------巨集計算的速度快,並且巨集還可以傳型別。

巨集相對於函式的缺點-------巨集會增加程式的長度。巨集沒有辦法除錯。巨集由於與型別無關,也就不夠嚴謹。巨集由於優先順序的問題,導致程式容易出錯。

(5)條件編譯

條件編譯語句的特徵就是語句前面有乙個「#」。

常用的:

#ifndef __test_h__

#define __test_h__

//標頭檔案的內容

#endif

//__test_h__

這個是用來避免標頭檔案的重複引入。

(6)標頭檔案的包含

標頭檔案可以用雙引號,也可以用尖括號。

如:

#include

"stdio.h"

//本地檔案包含

查詢策略:先在原始檔所在目錄下查詢,如果該標頭檔案未找到,編譯器就像查詢庫函式標頭檔案一樣在標準位置查詢標頭檔案。如果找不到就提示編譯錯誤。效率低。

#include

//庫檔案包含

查詢標頭檔案直接去標準路徑下去查詢,如果找不到就提示編譯錯誤。

程式環境和預處理

程式環境 1.翻譯環境 編譯 鏈結 先將組成乙個程式的每個原始檔通過編譯轉換成目標檔案,再將每個目標檔案通過編譯器 在一起鏈結成乙個 可執行檔案 翻譯過程 1.預處理 c c 標頭檔案展開,巨集替換,去注釋,條件編譯 2.編譯 c 彙編 3.彙編 彙編 二進位制 4.鏈結 常見的鏈結方式 2.執行環...

程式環境和預處理

一 程式的編譯環境和執行環境 1 每乙個程式的原始檔都會通過編譯過程轉換為相應的目標 2 每乙個目標 由鏈結器 在一起,形成乙個單一的可執行程式。3 鏈結器同時也會引入標準庫函式中被程式任意引用的庫函式,而且還可以搜尋程式設計師的個人程式庫,將需要的函式也鏈結到程式之中。編譯分為幾個階段組成 程式執...

程式環境和預處理

翻譯環境中源 被轉換為可執行的機器命令。預編譯 預處理指令。標頭檔案的包含,注釋刪除,define處理。相當於根據預處理指令組裝新的c c 程式。經過預處理,會產生乙個沒有標頭檔案 都已經被展開了 巨集定義 都已經替換了 沒有條件編譯指令 該遮蔽的都遮蔽掉了 沒有特殊符號的輸出檔案,這個檔案的含義同...