第21章 預處理

2022-06-17 07:12:15 字數 2150 閱讀 9918

1、巨集的高階使用--##,__va_args__, __file__, __function__等

2、#、 ## __va_args__ 的用法

1.1   #用在預編譯語句裡面可以把預編譯函式的變數直接格式成字串;如:#define func1(x) printf("the square of "  #x " is %d.\n",(x)*(x))  

呼叫func1(30);則輸出:the square of 30 is 900.

注意,不能直接在其它非預編譯函式直接使用#aa的形式,假如main函式裡面出現printf("the square of " #x " is %d.\n",(x)*(x))是不能通過編譯的.

1.2  ##巨集連線符

舉個例子:巨集定義為#define xname(n) x##n,**為:xname(4),則在預編譯時,巨集發現xname(4)與xname(n)匹配,則令 n 為 4,然後將右邊的n的內容也變為4,

然後將整個xname(4)替換為 x##n,亦即 x4,故 最終結果為 xname(4) 變為 x4.

1 #include 2

#define xname(n) x ## n

3#define print_xn(n) printf("x" #n " = %d/n", x ## n);

4int main(void)5

14

1)參考文章:c 語言的奇技淫巧

在 gunc 中的擴充套件,其形式如下。

#define log_debug(fmt, args...)  do  while(0);

2)參考文章:linux c程式設計一站式學習的第21章 預處理

gcc有一種擴充套件語法,如果##運算子用在__va_args__前面,除了起連線作用之外還有特殊的含義,例如核心**net/netfilter/nf_conntrack_proto_sctp.c中的:

#define debugp(format, ...) printk(format, ## __va_args__)
printk這個核心函式相當於printf,也帶有格式化字串和可變引數,由於核心不能呼叫libc的函式,所以另外實現了乙個列印函式。

這個函式式巨集定義可以這樣呼叫:debugp("info no. %d", 1)。也可以這樣呼叫:debugp("info")。後者相當於可變引數部分傳了乙個空引數,

但展開後並不是printk("info",),而是printk("info"),當__va_args是空引數時,##運算子把它前面的,號「吃」掉了。

3)除錯常用格式   

//

常用格式

#ifdef debug

#define debug(fmt, args...) printf("debug: " fmt "\n", ##args) //

or#define debug(fmt, ...) printf("debug: " fmt "\n", ## __va_args__);

#else

#define debug(fmt,args...)

#endif

//輸出檔名、函式名、行數

#ifdef debug

#define debug(fmt, args...) printf("%s, %s, %d: " fmt , __file__, __function__, __line__, ##args)

#else

#define debug(fmt, args...)

#endif

//輸出資訊含有彩色

#ifdef debug

#define debug(fmt,args...) \

dowhile(0

);#else

#define debug(fmt,args...)

#endif

第10章 預處理

10.1 預處理指令 指令 含義例項 define 定義巨集 define debug undef 取消巨集的定義 undef debug if判斷 if defined debug else cout debug elif else endif cout release error 輸出錯誤資訊 ...

第4章 資料預處理

inner join匹配查詢 select record date,city,age,category,price,gender,pay,mp from data1 inner join data2 on data1.id data2.id left join匹配查詢 select record d...

第14章 預處理器

c預處理器在源 編譯之前對其進行一些文字性質的操作。它的主要任務包括刪除注釋 插入被 include指令包含的檔案的內容 定義和替換由 define指令定義的符號以及確定 的部分內容是否應該根據一些條件編譯指令進行編譯。在 define中,如果定義的內容很長,可以分成幾行,除了最後一行之外,每行的末...