define巨集的高階用法

2021-08-28 13:37:38 字數 2654 閱讀 3512

參考:

#普通巨集定義

#define pi 3.14 //編譯階段替換掉巨集

#define t1 3+4 //容易產生歧義

#define t2 (3+4) //新增括號後,語義清楚

float r = 1.0;

float area = pi * r * r;

int a = 2* t1 #巨集替換後變成 int a = 2*3+4 不符合本意

ing a = 2* t2 #紅替換後變成 int a = 2*(3+4) 符合本意

#undef pi

float area = pi * r * r; #error: 『pi』 was not declared in this scope

//引號中的巨集定義不會被替換

printf("%s:%f\n", "pi", pi); //輸出 pi:3.14

//巨集定義的名字必須是合法識別符號

#define 0x abcd //error 不能以數字開始

//巨集定義中雙引號和單引號必須成對出現

#define test11 "z //error

#define test2 'z //error

//max和min的巨集定義帶引數

#define max(a,b) (a>b ? a:b)

#define min(a,b) (a2 ? 1:2) + (1<2 ? 1:2)

//引數個數必須巨集定義時形參的個數相同

max(1,2,3); //會報錯

#undef max //撤銷max的巨集定義

max(1,2); //error: 『max』 was not declared in this scope

#定義乙個交換數值的多行巨集,使用反斜槓連線不同行

#define swap(a,b) do while(0)

四、三個特殊符號:#,##,#@

#define connect(a,b) a##b

#define tochar(a) #@a

#define tostring(a) #a

//a##b表示連線

int n = connect(123, 456); //結果 n = 123456

char *str = connect("abcd", "efg"); //結果 str = "abcdefg"

//@#a 表示用單引號包括引數a,返回的是乙個字元

char * ch1 = tochar(1); //結果 ch = '1'

char * ch2 = tochar(123); //報錯,單引號只用在單個字元裡

//#a 表示用雙引號包括引數a,返回乙個字串

char * str1 = tostring(123); // str = "123"

#ifndef bodydef_h 

#define bodydef_h

//標頭檔案內容

#endif

#include "stdio.h"

//b表示位元組byte

#define mem_b( x ) ( *( (byte *) (x) ) )

//b表示字word,可以理解為int

#define mem_w( x ) ( *( (word *) (x) ) )

int main()

#define offsetof( type, field ) ( (size_t) &(( type *) 0)-> field )
#define fsiz( type, field ) sizeof( ((type *) 0)->field )
#define b_ptr( var ) ( (byte *) (void *) &(var) ) 

#define w_ptr( var ) ( (word *) (void *) &(var) )

#define upcase( c ) ( ((c) >= 'a' && (c) <= 'z') ? ((c) - 0x20) : (c) )
#define decchk( c ) ((c) >= '0' && (c) <= '9')
#define hexchk( c ) ( ((c) >= '0' && (c) <= '9') ||((c) >= 'a' && (c) <= 'f') ||((c) >= 'a' && (c) <= 'f') )
#define inc_sat( val ) (val = ((val)+1 > (val)) ? (val)+1 : (val))
#define arr_size( a ) ( sizeof( (a) ) / sizeof( (a[0]) ) )

define巨集的用法

再舉乙個使用無引數巨集替代字串的例子 define m y y 3 y include int main define m y y 3 y 定義m表示式 y y 3 y 在編寫源程式時,所有的 y y 3 y 都可由m代替,而對源程式作編譯時,將先由預處理程式進行巨集代換,即用 y y 3 y 表示...

define 的高階用法

原文 一 linux c中用define定義可變引數的巨集 一般在除錯列印debug資訊的時候,需要可變引數的巨集.從c99開始可以使編譯器標準支援可變引數巨集 variadic macros 另外gcc也支援可變引數巨集,但是兩種在細節上可能存在區別.1.va args va args 將 傳遞給...

define 巨集的用法備註

c99和gcc都支援,但是細節存在區別 在 va args 位置填入 中的內容 功能與上述一模一樣,在args中填充 的內容,可讀性更強,更簡潔 這個 操作符用於消除 為空時 va args 前面的那個逗號 例如 debug myerr 第一種巨集替換後成為fprintf stderr,myerr ...