在工程規模較小,不是很複雜,與硬體結合緊密,要求移植性的時候,可採用巨集定義簡化程式設計,增強程式可讀性。當巨集作為常量使用時,c程式設計師習慣在名字中只使用大寫字母。但是並沒有如何將用於其他目的的巨集大寫的統一做法。由於巨集(特別是帶引數的巨集)可能是程式中錯誤的**,所以一些程式設計師更喜歡使用大寫字母來引起注意。
1、簡單巨集定義無參巨集的巨集名後不帶引數,其定義的一般形式為:#define 識別符號 字串
// 不帶引數的巨集定義
#define max 10
注意:不要在巨集定義中放置任何額外的符號,比如"="或者尾部加";"使用#define來為常量命名一些優點:
2、帶引數的巨集帶引數的仍要遵循上述規則,區別只是巨集名後面緊跟的圓括號中放置了引數,就像真正的函式那樣。#define 《巨集名》(《引數列表》) 《巨集體》
注意引數列表中的引數必須是有效的c識別符號,同時以,分隔算符優先順序問題:
#define count(m) m*m
int x=5;
print(count(x+1));
print(count(++x));
//結果輸出:11 和42 而不是函式的輸出36
注意: 解決辦法:
分號吞噬問題:
#define foo(x) bar(x); baz(x)
假設這樣呼叫:
if (!feral)
foo(wolf);
將被巨集擴充套件為:
if (!feral)
bar(wolf);
baz(wolf);
==baz(wolf);==,不在判斷條件中,顯而易見,這是錯誤。如果用大括號將其包起來依然會有問題,例如
#define foo(x)
if (!feral)
foo(wolf);
else
bin(wolf);
判斷語言被擴充套件成:
if (!feral) >>++;++<<
else
bin(wolf);
==else==將不會被執行解決方法:通過==dowhile(0)
#define foo(x) dowhile(0)
if (!feral)
foo(wolf);
else
bin(wolf);
被擴充套件成:
#define foo(x) dowhile(0)
if (!feral)
dowhile(0);
else
bin(wolf);
注意:使用dowhile(0)構造後的巨集定義不會受到大括號、分號等的影響,總是會按你期望的方式呼叫執行。
3、#運算子
#的作用就是將#後邊的巨集引數進行字串的操作,也就是將#後邊的引數兩邊加上一對雙引號使其成為字串。例如a是乙個巨集的形參,則替換文字中的#a被系統轉化為"a",這個轉換過程即為字串化。
#define test(param) #param
char *pstr=test(123);
printf("psrt=%sn",pstr);
//輸出結果為字元 」123「
4、##運算子##運算子也可以用在替換文字中,它的作用起到粘合的作用,即將兩個巨集引數連線為乙個數
#define test(param1,param2) (param1##param2)
int num =test(13,59);
printf("num=%dn",num);
//輸出結果為:num=1359
5、va_args作用主要是為了方便管理軟體中的列印資訊。在寫**或debug時通常需要將一些重要引數列印出來,但在軟體發行的時候不希望有這些列印,這時就用到可變引數巨集了。
# define pr(...) printf(_va_args_)
2 pr("hello worldn");
34 輸出結果:hello world
#ifndef comdef_h
#define comdef_h
//標頭檔案內容
#endif
#define mem_b(x) (*((byte *)(x)))
#define mem_w(x) (*((word *)(x)))
#define max(x,y) (((x)>(y)) ? (x) : (y))
#define min(x,y) (((x) < (y)) ? (x) : (y))
#define fpos(type,field) ((dword)&((type *)0)->field)
#define fsiz(type,field) sizeof(((type *)0)->field)
#define flipw(ray) ((((word)(ray)[0]) * 256) + (ray)[1])
#define word_lo(***) ((byte) ((word)(***) & 255))
#define word_hi(***) ((byte) ((word)(***) >> 8))
#define upcase(c) (((c)>='a' && (c) <= 'z') ? ((c) – 0×20) : (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])))
C C 各型別的最大值 最小值巨集
include 中各型別的最大值 最小值 char min char的最小值 schar max signed char 最大值 schar min signed char 最小值 uchar max unsigned char 最大值 shrt max short 最大值 shrt min sho...
Linux C 最正確的取最大最小值巨集
這裡以兩個值中取最小值為例 define min t type,x,y gnu c把包含在括號中的復合語句看成是乙個表示式,稱為語句表示式,它可以出現在任何允許表示式的地方.我們可以在語句表示式中使用原本只能在復合語句中使用的迴圈 區域性變數等,例如 define min t type,x,y in...
獲取整數的最大值最小值的巨集定義
在c c 程式設計中時常需要使用整數的最大值最小值,通常這兩個常用是跟平台和作業系統有關的,不同的平台會有不同的值,因此可移植的辦法就是推薦使用庫函式提供的常量定義。1 類似的常量定義在limits.h和float.h標頭檔案中,可以檢視原始檔獲取類似常量的使用辦法。在標頭檔案中,整數的最值通常是這...