一段优雅的C语言宏代码

macro.h文件

#ifndef __W_ERRORINFO_H__
#define __W_ERRORINFO_H__
#include <stdio.h>

#define ERROR_MAP(XX)                                   \
XX(W_ERROR_DEBUG        ,"调试信息")                    \
XX(W_ERROR_SEGV         ,"段错误信息")                   \
XX(W_ERROR_WARINIG      ,"警告信息")                    \
XX(W_ERROR_OTHER        ,"其它信息")

#define W_ERROR_EOF (0xff)

typedef enum __error_type_t
{
    #define XX(name,_)  name,
    ERROR_MAP(XX)
    #undef XX
    W_ERROR_MAX=W_ERROR_EOF-1
}error_type_t;

#define ERROR_NAME_GEN(name, _) case name: return #name;
const char* error_getname(int err) {
  switch (err) {
    ERROR_MAP(ERROR_NAME_GEN)
    default:
      return NULL;
  }
}
#undef ERROR_NAME_GEN

#define ERROR_INFO_GEN(name, info) case name: return info;
const char* error_getinfo(int err) {
  switch (err) {
    ERROR_MAP(ERROR_INFO_GEN)
    default:
      return "未知信息";
  }
}
#undef ERROR_INFO_GEN

#define ERROR_PRINT_GEN(name,info) printf("value:%d, name:%s, info:%s\n",name,#name,info);
void error_print()
{
    ERROR_MAP(ERROR_PRINT_GEN)
}
#undef ERROR_PRINT_GEN

static unsigned char* error_table[]=
{
    #define XX(_,info)  info,
    ERROR_MAP(XX)
    #undef XX
    "未知信息"
};
#define ERROR_MSG(MSG)  error_table[MSG]

#endif //__W_ERRORINFO_H__

test.c文件

#include "macro.h"

int main()
{
    printf("value:%d, name:%s, info:%s\n",W_ERROR_DEBUG,error_getname(W_ERROR_DEBUG),error_getinfo(W_ERROR_DEBUG));
    printf("====================================================我是分割线==================================================\n");
    error_print();
    printf("====================================================我是分割线==================================================\n");
    printf(ERROR_MSG(W_ERROR_SEGV));
}