參考:
#普通巨集定義
#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 ...