在我們平時的開發工程中,會經常使用到巨集,它功能強大,用的好會帶來意想不到的妙用。今天來整理下一些常見的用法,方便回顧。
#:將其後面的巨集引數進行字串化操作(stringfication)
注意:a、忽略傳入引數名前面和後面的空格。
b、當傳入引數名間存在空格時,編譯器將會自動連線各個子字串,用每個子字串之間以乙個空格連線,忽略剩餘空格。
c、如果#後的引數本身也是乙個巨集的話,#會阻止這個巨集的展開,解決方法也很簡單,加多一層中間轉換巨集,加這層巨集的用意就是把所有巨集的引數在這層裡全部展開。
##:被稱為連線符(concatenator),用來將兩個token連線為乙個token。注意這裡連線的物件是token就行,而不一定是巨集的變數。
注意:a、當用##連線形參時,##前後的空格可有可無。
b、連線後的實際引數名,必須為實際存在的引數名或是編譯器已知的巨集定義。
c、如果##後的引數本身也是乙個巨集的話,##會阻止這個巨集的展開,解決方法也很簡單,加多一層中間轉換巨集,加這層巨集的用意就是把所有巨集的引數在這層裡全部展開。
#@:將傳入單字元引數名轉換成字元,以一對單引號括起來。
\:續行符,當定義的巨集不能用一行表達完整時,可以用「\」表示下一行繼續此巨集的定義,注意 \ 前留空格。
可變引數巨集:
c99編譯器標準允許定義可變引數巨集(variadic macros),可變引數巨集就像下面這個樣子:
#define debug(...) printf(__va_args__)
預設號代表乙個可以變化的參數列。使用保留名 __va_args__ 把引數傳遞給巨集。當巨集的呼叫展開時,實際的引數就傳遞給 printf()了。
注意:如果預設號之前有逗號,就要寫成下面的形式:
#define debug(format, ...) printf (format, ##__va_args__)
「## 」的意思是,如果可變引數被忽略或為空,將使預處理器(preprocessor)去除掉它前面的那個逗號。
編譯器內建的巨集定義:
ansi c的標準預定義巨集:
__date__ : 以「月 日 年」的格式替換為當前日期,型別為字串
__file__ : 替換為當前源檔名包括路徑,型別為字串
__line__ : 替換為當前行號,可以結合#line進行設定,#line之後的數字代表#line下一行的行號,之後行號以此類推,型別為整型值
__stdc__ : 當要求程式嚴格遵循ansi c標準時該標識被賦值為1
__time__ : 以「時:分:秒」的格式替換為當前時間,型別為字串
__timestamp__ : 以」星期 月 日 時:分:秒 年「的格式替換為最後一次修改當前原始檔的時間,型別為字串
C 靈活使用C C 巨集定義
靈活使用c c 巨集定義 define巨集定義在c語言中有廣泛使用。對於c 語言,effective c 第二章告訴我們,在c 中盡量用const enum inline替換 define,可以避免很多陷阱。其中const用於定義常量,enum用於定義列舉,inline用於定義內聯函式。儘管 eff...
C 常見預定義巨集的使用
在標準c以及各中編譯器中定義了一些物件巨集,這些巨集的名稱以 開頭和結尾,並且都是大寫字元.這些預定義巨集可以被 undef,也可以被重定義。在ansi c標準中定義了 file line,data,time,stdc 等標準的預定義巨集。gcc對其進行擴充套件,也定義了多個預定義巨集。概括起來gc...
C C 預定義巨集
下面描述的巨集定義,不需引用其他標頭檔案,直接可用於 中。特定的作用給我們提供了不少的便利。分別描述如下 1 file line function 或者 func file 當前程式行所在原始檔名稱,標準c支援,該巨集當做字串對待 line 當前程式行所在原始檔內的行號,標準c支援,該巨集當做整形對...