#的作用就是將#後邊的巨集引數進行字串的操作,也就是將#後邊的引數兩邊加上一對雙引號使其成為字串。例如a是乙個巨集的形參,則替換文字中的#a被系統轉化為"a",這個轉換過程即為字串化。
#define test(param) #param
char
*pstr=
test
(123);
printf
("psrt=%s\n"
,pstr)
;
輸出結果:
psrt=
123
表示的意思是字串123,這裡的#***,可以是數字也可以是字母,反正都是字串含義
##運算子也可以用在替換文字中,它的作用起到粘合的作用,即將兩個巨集引數連線為乙個數
#define test(param1,param2) (param1##param2)
int num =
test(13
,59);
printf
("num=%d\n"
,num)
;
輸出結果:
num=
1359
#define test(string) "123"string"456"
printf
("%s\n"
,test
("789"))
;
輸出結果:
123789456
這裡的"123"string"456"也可以是「abc」string「cde」
#define log_warning(psfmz, args...) bf_log_printf(s_uclogid, log_l_warning, psfmz, ##args)
#define log_trace(psfmz, args...) bf_log_printf(s_uclogid, log_l_trace, psfmz, ##args)
#define log_error(psfmz, args...) bf_log_printf(s_uclogid, log_l_error, psfmz, ##args)
#define log_api(psfmz, args...) bf_log_printf(s_uclogid, log_l_api, psfmz, ##args)
理解為有##可以有參無參,但是沒有##無參會報錯
#ifndef comdef_h
#define comdef_h
//標頭檔案內容
#endif
#define mem_b(x) (*((byte *)(x)))
#define mem_w(x) (*((word *)(x)))
#define word_lo(***) ((byte) ((word)(***) & 255))
#define word_hi(***) ((byte) ((word)(***) >> 8))
#define arr_size(a) (sizeof((a))/sizeof((a[0])))
#include
#define new_rect(length , width)
struct rect
;int
main()
編譯結果:
10,5
在上面的demo基礎上加點難度,新增函式指標成員
#include
#define new_rect(length , width)
struct rect
;int
calc_area
(struct rect *prect)
intmain()
編譯結果:
rect_area =
50
巨集定義的一些特殊用法
1 有參巨集定義中 的用法 definestr str str 用於把巨集定義中的引數兩端加上字串的 比如,這裡str my name 會被替換成 my name 一般由任意字元都可以做形參,但以下情況會出錯 str 這樣,編譯器不會把 當成str 的引數。str 同上,編譯器不會把 當成str的引...
C C 巨集的一些特殊用法
在c c 中,巨集定義是由define完成的,define中有三個特殊的符號值得我們注意 1.在巨集展開的時候會將 後面的引數替換成字串,如 define p exp printf exp 呼叫p asdfsadf 的時候會將 exp換成 asdfsadf 2.將前後兩個的單詞拼接在一起。例如 th...
C語言巨集的特殊用法和幾個坑
2 years ago source 總結一下c語言中巨集的一些特殊用法和幾個容易踩的坑。由於本文主要參考gcc文件,某些細節 如巨集引數中的空格是否處理之類 在別的編譯器可能有細微差別,請參考相應文件。巨集僅僅是在c預處理階段的一種文字替換工具,編譯完之後對二進位制 不可見。基本用法如下 1.標示...