原创 C语言多次展开宏的技巧

2011-6-13 16:03 4976 6 6 分类: 消费电子

学习自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
 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
6
关闭 站长推荐上一条 /3 下一条