預處理發生在編譯之前,預處理輸出的是乙個單一的檔案,這個檔案被送到編譯器,進行編譯。
每條預處理命令都控制預處理器的行為。每條預處理命令佔據一行,有以下的格式:
* # 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。每個預處理指令均帶有符號 簡單來說,上面的這些...