巨集的特殊用法

2021-10-24 16:17:43 字數 2129 閱讀 5957

#的作用就是將#後邊的巨集引數進行字串的操作,也就是將#後邊的引數兩邊加上一對雙引號使其成為字串。例如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.標示...