学习自Chrome源码剖析【二】—— 进程通信 http://flyvenus.net/wordpress/?p=141
多次展开宏,一个宏可以定义多个类型,如枚举量,数组等。
以下程序适用于GCC编译。
1. key_macros.h
#undef BEGIN_DEFINE_KEY
#undef DEFINE_KEY
#undef END_DEFINE_KEY
#if defined( DEFINE_KEY_ENUM )
#undef DEFINE_KEY_ENUM
#define BEGIN_DEFINE_KEY \
typedef enum{
#define DEFINE_KEY(name) \
CARD_KEY_##name,
#define END_DEFINE_KEY \
}CARD_KEY;
#elif defined( DEFINE_KEY_NAME )
#undef DEFINE_KEY_NAME
#define BEGIN_DEFINE_KEY \
const char *KeyName[CARD_KEY_MAX+1] = {
#define DEFINE_KEY(name) \
[CARD_KEY_##name] = "CARD_KEY_"#name,
#define END_DEFINE_KEY \
};
#endif
2. key_definition.h
#include "key_macros.h"
BEGIN_DEFINE_KEY
DEFINE_KEY(INVALID)
DEFINE_KEY(LEFT)
DEFINE_KEY(RIGHT)
DEFINE_KEY(UP)
DEFINE_KEY(DOWN)
//...
DEFINE_KEY(MAX)
END_DEFINE_KEY
3. main.c
#define DEFINE_KEY_ENUM
#include "key_definition.h"
#define DEFINE_KEY_NAME
#include "key_definition.h"
#include <stdio.h>
int main()
{
int i;
printf("key value %d\n", CARD_KEY_INVALID);
printf("key value %d\n", CARD_KEY_LEFT);
printf("key value %d\n", CARD_KEY_RIGHT);
printf("key value %d\n", CARD_KEY_UP);
printf("key value %d\n", CARD_KEY_DOWN);
printf("key value %d\n", CARD_KEY_MAX);
for(i = 0;i < CARD_KEY_MAX;i++)
printf("key name %d=%s\n", i, KeyName);
return 0;
}
程序输出
key value 0
key value 1
key value 2
key value 3
key value 4
key value 5
key name 0=CARD_KEY_INVALID
key name 1=CARD_KEY_LEFT
key name 2=CARD_KEY_RIGHT
key name 3=CARD_KEY_UP
key name 4=CARD_KEY_DOWN
文章评论(0条评论)
登录后参与讨论