C語言X-MACRO宏使用技巧
1、#define與#undef
X-MACRO宏技術的核心在于靈活的應用#define與#undef,對于玩C語言的伙計#define是再熟悉不過了,但#undef卻鮮有人在實際的開發(fā)過程中熟練使用,基本上都是#define走天下。
那#define的作用域是怎樣的呢?其作用范圍都是從宏定義處到文件結束,不管函數(shù)內外均可以隨意使用。
那一不小心使用#define重復定義相同的宏又會怎樣呢?對于大部分編譯器會報重復定義警告,但也有小部分編譯器采用最近的宏定義直接通過,所以稍不留神就把bug引入到了代碼中。
其實對于C語言編程素養(yǎng)良好的工程師們多會使用#undef來限制宏定義的作用范圍,即取消宏定義,以免造成宏泛濫。
1#include <stdio.h>
2#include <stdlib.h>
3
4#define HELLO_BUG 100
5
6int main(int argc, char *argv[]) {
7
8 printf("hello bug %d\r\n",HELLO_BUG);
9
10#undef HELLO_BUG
11
12 printf("hello bug %d\r\n",HELLO_BUG);
13 return 0;
14}
如上代碼所示,便會編譯報錯,提示第二條打印語句HELLO_BUG宏未定義。
2、X-MACRO
X-MACRO平時我們也叫"X宏",其實在bug菌之前的文章<三種管理C程序中標志位的方法,最后一種比較秀~>有一個簡單的提及,今天單獨擰出來簡化講講。
1#define X_MACRO(a, b) a
2//do something
3#undef X_MACRO
4
5#define X_MACRO(a, b) b
6//do something
7#undef X_MACRO
如上是X-MACRO的比較精華的幾句,通過#define與#undef的配合,可以使用相同的宏名稱選擇性的替換出我們想要的結構,從而達到簡化代碼的目的。同時我們也非常清楚,由于宏主要是靠編譯器來處理,所以X-MACRO技巧也主要是在編譯階段來維護代碼。
下面來一波操作看看效果吧:
1/*************消息定義**********/
2#define MSG_TABLE \
3 X_MACROS(USER_MSG1, MsgProc1) \
4 X_MACROS(USER_MSG2, MsgProc2) \
5 X_MACROS(USER_MSG3, MsgProc3) \
6
7/*************消息枚舉定義**********/
8typedef enum {
9 #define X_MACROS(a, b) a,
10 MSG_TABLE
11 #undef X_MACROS
12 MSG_MAX
13} MSG_TYPE;
14
15/*************消息處理定義**********/
16const Proc Proc_table[] = {
17 #define X_MACROS(a, b) b,
18 MSG_TABLE
19 #undef X_MACROS
20};
21
22/*************實際使用**********/
23void sMessageProc(MSG_TYPE msgtype)
24{
25 (Proc_table[msgtype])();
26}
當然X-MACRO還可以擴展多個參數(shù)來供序列化替換,同時X-MACRO宏定義也可以更加的復雜。
比如使用#define X_MACROS(a, b) #a宏來處理為字符串等。