2010/08/30

C語言巨集macro 介紹與幾個sample寫法

例: 常見的 ## (連接), #@ (字元化), # (字串化)

1. x ## y :表示x連接y, 注意x與y需同一型態
2. #@ x :據說可以字元化, 但這是不常用的語法, 而且我編譯會出現error: ‘#’ is not followed by a macro parameter
3. # x :表示將x字串化

#define beConn(x, y)	x ## y//#define ToChar(x)       #@ x   #define beStr(x)		# xint main(void) {	int num = beConn(12, 34);	printf("beConn(12, 34) : %d \n", num); //	char c = ToChar(1);  //	printf("beChar(1) : %c \n", c);		printf("beStr(I am string) : %s \n", beStr(I am string));	return 0;}

輸出:
beConn(12, 34) : 1234
beStr(I am string) : I am string

例: 透過 #define 可以變成 function

定義更美觀易讀的語法,    ” \” 表示視為同一行

#define ATK_CHK(list, cb, skb, dir)        \{        \int atk;        \\for (atk = 0 ; list[dir][atk] != EMPTY_VALUE ; atk++) {        \if(cb[list[dir][atk]] && cb[list[dir][atk]](skb, (struct iphdr *)skb->nh.iph) == IS_ATTACK)        \return AEGIS_BLOCK;            \}        \}

例: 透過 #define 與內嵌X()變化, 做出enum與之字串化

延伸閱讀:
C語言巨集macro: 將enum的integer變數 印出變成string

1. 假設這段程式碼可用於pwr_state.h檔案 當作宣告 stringify_PWR_state_t()

#pragma once#define PWR_STATES \X(PWR_STATE_ENABLED, 0) \X(PWR_STATE_DISABLED_REBOOT_REQUIRED, 1) \X(PWR_STATE_DISABLED_MANUAL_ENABLE, 2) \X(PWR_STATE_DISABLED, 3) \X(PWR_STATE_PSW_NOT_AVAILABLE, 4) \X(PWR_STATE_UNKNOWN, -1)#define X(x_state, x_value) x_state = x_value,typedef enum { PWR_STATES } pwr_state_t;#undef Xconst char* stringify_pwr_state_t(pwr_state_t state);

2. 然後更改一下x()的定義, 假設在pwr_state.c檔案

#include #define X(x_state, x_value) case x_state: return # x_state;const char* stringify_pwr_state_t(pwr_state_t state){    switch (state) {        PWR_STATES    default:        return "Unknown state.";    };}#undef X

沒有留言:

張貼留言