今天學socket發現/usr/include/bits/sockaddr.h 檔案35行有這麼一句話
1、一般用法
我們使用#把巨集引數變為乙個字串,用##把兩個巨集引數貼合在一起.
用法:
二、當巨集引數是另乙個巨集的時候
需要注意的是凡巨集定義裡有用'#'或'##'的地方巨集引數是不會再展開.
1, 非'#'和'##'的情況
2, 當有'#'或'##'的時候
int_max和a都不會再被展開, 然而解決這個問題的方法很簡單. 加多一層中間轉換巨集.
加這層巨集的用意是把所有巨集的引數在這層裡全部展開, 那麼在轉換巨集裡的那乙個巨集(_str)就能得到正確的巨集引數.
printf("int max: %s/n", str(int_max));
輸出為: int max: 0x7fffffff
str(int_max) --> _str(0x7fffffff) 然後再轉換成字串;
printf("%d/n", cons(a, a));
輸出為:200
cons(a, a) --> _cons((2), (2)) --> int((2)e(2))
三、'#'和'##'的一些應用特例
1、合併匿名變數名
例:anonymous(static int); 即: static int _anonymous70; 70表示該行行號;
第一層:anonymous(static int); --> __anonymous0(static int, __line__);
第二層: --> ___anonymous1(static int, _anonymous, 70);
第三層: --> static int _anonymous70;
即每次只能解開當前層的巨集,所以__line__在第二層才能被解開;
2、填充結構
相當於:
msg _msg = ,
}; 3、記錄檔名
4、得到乙個數值型別所對應的字串緩衝大小
--> char buf[_type_buf_size(0x7fffffff)];
--> char buf[sizeof "0x7fffffff"];
這裡相當於:
char buf[11];
巨集是個好東西,核心**裡面好多巨集呢!!一竅不通會搞死滴~~
C巨集定義 和 的用法
1 是用來把變數名轉換為字串的,例如 define print val printf val d n val int main 通過預編譯 gcc e test.c o test.i 得到結果 int main 其作用相當於為輸入值新增了一對雙引號。2 用於連線字元,例如 define name n...
C語言 巨集定義的用法總結
define 函式 define debug x x x 如上所示,用於對數值表示式進行求值的巨集定義都應該用這種方式加上括號,避免在使用巨集時由於引數中的操作等或鄰近操作符之間不可預料的相互作用。define 替換 1.在呼叫巨集時,首先對引數進行檢查,看看是否包含任何由 define 定義的符號...
巨集定義 號用法
define s x 自動給引數x轉換為 x 轉換為字串 這裡的語言符號不一定是巨集的變數 include define s x system x void main c語言中 被稱為連線符 它是一種預處理運算子,用來把兩個語言符號 token 組合成單個語言符號 這裡的語言符號不一定是巨集的變數。...