c 預處理和預處理命令

2021-07-11 18:36:18 字數 2792 閱讀 5265

預處理發生在編譯之前,預處理輸出的是乙個單一的檔案,這個檔案被送到編譯器,進行編譯。

每條預處理命令都控制預處理器的行為。每條預處理命令佔據一行,有以下的格式:

* # character

* 預處理命令(one of define, undef, include, if, ifdef, ifndef, else, elif, endif, line, error, pragma)

* 引數

* 換行符

預處理命令可以條件編譯源程式的某一部分。指令包括:

#if expression      

#ifdef expression

#ifndef expression

#elif expression

#else

#endif

expression must be const expression

#define abcd 2

#include int main()

//output:

//1: yes

//2: yes

//3: yes

語法:

#define identifier replacement-list(optional)   (1) 

#define identifier( parameters ) replacement-list (2)

#define identifier( parameters, ... ) replacement-list (3) (since c++11)

#define identifier( ... ) replacement-list (4) (since c++11)

#undef identifier (5)

不能重複定義相同的巨集,否則,編譯會報錯。但是,如果重複定義的巨集完全相同,則,沒有任何問題。

(1)的形式。

(2)(3)(4)的形式

(2) 引數個數固定

(3)(4) 可變引數個數,引數能夠被訪問通過:va_args

#被用在replacement-list 中,放在變數前,目的是字串化該變數。生成的結果是「...」。

#define showlist(...) puts(#__va_args__)

showlist(); // expands to puts("")

showlist(1, "x", int); // expands to puts("1, \"x\", int")

##用來連線兩個identifier

#include #define function(name, a) int fun_##name()

function(abcd, 12)

function(fff, 2)

function(qqq, 23)

#undef function

#define function 34

#define output(a) std::cout<<#a#include (1)

#include "filename" (2)

#include 搜尋檔案的路徑為:standard include directories 。標準c庫和c++庫的目錄都被加入到了standard include directories。standard include directories 通常通過編譯選項來定義。如果在standard include directories沒有搜尋到該檔案,程式將會報錯。

#include "filename" 搜尋檔案的路徑為: 先在當前檔案所在目錄下搜尋,如果沒有搜尋到,將在standard include directories下搜尋。如果,都沒有搜尋到,程式報錯。

注意問題:

乙個檔案可能被重複include,或者遞迴地include, 為了避免這個問題,通常要在include的檔案中,加入一些預處理命令(通常是標頭檔案)。

#define foo_h_included

// contents of the file are here

#endif

#ifndef text

#define text

#include __file__

int main()

#endif

語法:

#error error_message
用於對編譯前的檢測,程式遇到error,就會停止編譯。

語法: #pragma pragma_paramsc++ 標準不包含這些指令,但是編譯器廠商會根據自己的需要,定義自己的指令。如果程式遇到不認識的#pragma指令,會直接跳過,不會報錯。

語法:

#line lineno    (1) 

#line lineno "filename" (2)

改變指令之後的line變數和file變數。

#include #define fname "test.cc"

int main()

//output: test: test.cc:777: int main(): assertion `2+2 == 5' failed.

C 預處理命令

c 提供的預處理功能 巨集定義 檔案包含和條件編譯 分別由巨集定義命令 檔案包含命令和條件編譯命令三種預處理命令來實現。預處理命令 格 式 預處理命令 末尾不加分號 作用域 從定義點到程式結束 說 明 預處理命令獨佔一行,位置任意 巨集定義命令 格 式 define 巨集名 形參 巨集體 undef...

C 預處理命令

和 操作符是和 define巨集使用的.使用 使在 後的首個引數返回為乙個帶引號的字串.例如,命令 define to string s s 將會使編譯器把以下命令 cout to string hello world endl 理解為 cout hello world endl 使用 鏈結 前後的...

C 預處理命令

預處理就是對原始檔進行編譯前,先對預處理部分進行處理,然後對處理後的 進行編譯。c 提供了豐富的預處理指令,主要包括如下幾種 define error if else elif endif ifdef ifndef undef line和 pragma。每個預處理指令均帶有符號 簡單來說,上面的這些...