預編譯命令總結

2021-05-23 22:10:25 字數 1455 閱讀 2763

今天覆習了下條件編譯命令,總結如下。

常用的有三種預編譯命令:巨集定義,檔案包含和條件編譯。 

1 巨集定義即是字串替換。巨集分為無參巨集和含參巨集。

定義巨集的位置可以在函式外部也可以在函式內部(vc++ 2008 測試通過)。

巨集的作用域是從定義處到取消定義命令[#undef 巨集名]之間的部分,若無顯式的#undef命令則預設到檔案結束。可以使用defined命令可以判斷巨集是否被定義#if defined x (=#ifdef x),#if !defined x (= ifndef x)。

定義含參巨集格式如#define sq(y) ((y)*(y)),其中引數為y,巨集得到的是y平方。為了保證巨集替換的正確性,多加了3個括號。但這樣的保證也是有限的,它要求y的值不能在(y)內改變,如把y換成i++將得不到期望的結果。

巨集呼叫(實際上是巨集替換)不用考慮形參的型別,這帶來一定的好處。如求兩個數最大值的巨集#define max(a,b) (a>b)?a:b,實參可以是int,double等。

巨集定義可以包括多個語句,如#define change(x1,x2,x3,x4) x1 += 1;x2 += 2; x3 += 3; x4 +=4;

2 檔案包含命令#include的功能是把指定的檔案插入該命令列位置取代該命令列,從而把指定的檔案和當前的源程式檔案連成乙個原始檔。

源**分布於多個檔案時,建議使用呼叫檔案+標頭檔案+實現檔案的模式。標頭檔案中包含要用到的函式說明,型別定義,巨集定義,常數值等。具體的實現放在實現檔案中。在呼叫檔案和實現檔案中都包含該標頭檔案即可。

為了避免重複包含標頭檔案,可在標頭檔案中使用#ifndef [標頭檔案標示符(如x_header等等)] + 標頭檔案內容 + #endif模式。

3 條件編譯命令可以按不同的條件去編譯不同的程式部分,因而產生不同的目標**檔案。 這對於程式的移植和除錯很有用。

條件編譯有三種形式,下面分別介紹: 

第一種形式根據有無對應巨集定義選擇編譯程式段:

#ifdef 識別符號 // 或 #ifndef 標示符

程式段1

#else

程式段2

#endif

第二種形式根據常量表示式值選擇編譯,值為非0執行if段。

#if 常量表示式

程式段1

#else

程式段2

#endif

這裡一定要是常量表示式,一般為巨集。若是表示式包含變數則編譯器只能隨便猜乙個了。

第三種形式含有#elif,看個例子吧

#define abc 3

void main()

其餘的預編譯命令如下,這裡就不研究它們了。

#line 標誌該語句所在的行號

# 將巨集引數替代為以引數值為內容的字元竄常量

## 將兩個相鄰的標記(token)連線為乙個單獨的標記

#pragma 說明編譯器資訊

#warning 顯示編譯警告資訊

#error 顯示編譯錯誤資訊

C C 預編譯命令

一 基本知識 預處理器指示符以 號開頭標識,處理這些指示符的程式叫做預處理器。include指示符讀入指定檔案的內容,它有兩種格式 include include my file.h 如果檔名用 括起來,表明這個檔案是乙個工程或標準標頭檔案,查詢過程會先檢查預定義的目錄,我 們可以通過設定環境變數或...

預編譯處理命令

if endif是c 種的條件編譯預處理命令 有兩種格式 1 ifdef 標示符 程式段1 else 程式段2 endif 表示 如果標示符已經被 define命令定義過,則編譯程式段1,否則編譯程式段2 2 if 表示式 程式段1 else 程式段2 endif 表示 如果表示式為真,則編譯程式段...

預編譯指令的總結

二 檔案包含 include 三 條件編譯 所謂的預編譯指令,就是指在 編譯c語言 之前,對原始碼進行處理的指令。預編譯指令,不是c語言。c語言中的預編譯指令,都以 開頭。實際上,編譯器的編譯過程,是 cl c p first.c cl c fas first.c c語言的預處理主要有三個方面的內容...