預編譯 包括標頭檔案 巨集 條件編譯等預處理

2021-10-03 16:01:15 字數 2337 閱讀 1228

預編譯又稱為預處理,是做些**文字的替換工作。是整個編譯過程的最先做的工作。處理以# 開頭的指令 , 比如拷貝 #include 包含的檔案**,#define 巨集定義的替換 , 條件編譯等,就是為編譯做的預備工作的階段。主要處理#開始的預編譯指令,預編譯指令指示了在程式正式編譯前就由編譯器進行的操作,可以放在程式中的任何位置。

常見的預編譯指令有:

(1)#include 指令

該指令指示編譯器將***.***檔案的全部內容插入此處。若用<>括起檔案則在系統的include目錄中尋找檔案,若用" 「括起檔案則在當前目錄中尋找檔案。一般來說,該檔案是字尾名為"h"或"hpp"的標頭檔案。

注意:<>不會在當前目錄下搜尋標頭檔案,如果我們不用<>而用」"把頭檔名擴起,其意義為,先在當前目錄下搜尋標頭檔案,再在系統預設目錄下搜尋。

(2)#define指令

該指令有三種用法:

定義標識:標識有效範圍為本翻譯單元本指令之後,形如#define ***,常與#if配合使用;

定義常數:如#define max 100,則max代表100(這種情況下使用const定義常數更好,原因見註1);

定義"函式":如#define get_max(a, b) ((a)>(b)?(a):(b)) 則以後使用get_max(x,y)就可以得到x和y中較大的數,建議還是用內聯函式而不是這種方法提高速度。雖然巨集定義函式有這樣的弊病,但這種方法的確非常靈活,因為a和b可以是各種資料型別。

定義"巨集函式":如#define gen_fun(type) type max_##type(type a,type b) ,使用時,用gen_fun(int),則此處預編譯後就變成了 max_int(int a,int b),以後就可以使用max_int(x,y)就可以得到x和y中較大的數.比第三種,增加了型別的說明。

(3)#if、#else和#endif指令

這些指令一般這樣配合使用:

#if defined(標識)  // 如果定義了標識

………… // 要執行的指令

#else // 否則

………… // 要執行的指令

#endif //結束

問題1:什麼是預編譯?何時需要預編譯?

預編譯又稱預處理,是整個編譯過程最先做的工作,即程式執行前的一些預處理工作。主要處理#開頭的指令。如拷貝#include包含的檔案**、替換#define定義的巨集、條件編譯#if等。.

何時需要預編譯:

1、總是使用不經常改動的大型**體。

2、程式由多個模組組成,所有模組都使用一組標準的包含檔案和相同的編譯選項。在這種情況下,可以將所有包含檔案預編譯為乙個預編譯頭。

問題2:寫乙個「標準」巨集,這個巨集輸入兩個引數並返回較小的乙個

#define min(x, y) ((x)<(y)?(x):(y)) //結尾沒有;

問題3:#與##的作用?

#是把巨集引數轉化為字串的運算子,##是把兩個巨集引數連線的運算子。

例如:語句

解釋#define str(arg) #arg

則巨集str(hello)展開時為」hello」

#define name(y) name_y

則巨集name(1)展開時仍為name_y

#define name(y) name_##y

則巨集name(1)展開為name_1

#define declare(name, type) typename##_##type##_type

則巨集declare(val, int)展開為int val_int_type

問題4:如何避免標頭檔案被重複包含?

例如,為避免標頭檔案my_head.h被重複包含,可在其中使用條件編譯:

#ifndef _my_head_h

#define _my_head_h /空巨集/

/其他語句/

#endif

問題5:標頭檔案的解釋和用途?

#include :是標準輸⼊輸出函式庫頭⽂件。頭⽂件是擴充套件名為.h的⽂件,包含了 c 函式宣告和巨集定義,被多個源⽂件中引⽤共享。有兩種型別的頭⽂件:程式設計師編寫的頭⽂件和編譯器⾃帶的頭⽂件。在程式中要使⽤頭⽂件,需要使⽤ c 預處理指令#include來引⽤它。stdio.h頭⽂件,它是編譯器⾃帶的頭⽂件。引⽤頭⽂件相當於複製頭⽂件的內容,但是我們不會直接在源⽂件中複製頭⽂件的內容,因為這麼做很容易出錯,特別在程式是由多個源⽂件組成的時候。

預編譯標頭檔案

stdafx.h標頭檔案的作用 今天在改乙個很大的程式,慢慢看,慢慢改。突然發現乙個.c檔案,裡面什麼也沒有,就幾個標頭檔案,我一看,我靠,這不是把簡單的問題搞複雜了嗎,隨手刪掉那個c檔案。結果不能編譯了,我靠 fatal error c1083 cannot open precompiled he...

預編譯標頭檔案

一 預編譯標頭檔案使用經驗 如果預編譯標頭檔案被正確使用時,它確實大大提高我們程式設計的效率 你工作中,有多少時間是在等編譯完成?很多吧,這個時候一般都很無聊,無奈,浪費時間 但是他太容易用錯了.下面是幾種常見的錯誤用法.1 在預編譯標頭檔案裡include自己的標頭檔案 當然,如果你的標頭檔案不經...

預編譯標頭檔案

預編譯標頭檔案 今天在改乙個很大的程式,慢慢看,慢慢改。突然發現乙個.c檔案,裡面什麼也沒有,就幾個標頭檔案,我一看,我靠,這不是把簡單的問題搞複雜了嗎,隨手刪掉那個c檔案。結果不能編譯了,我靠 fatal error c1083 cannot open precompiled header fil...