有些时候我们在程序中定义一些错误码时,常常会有一个随之对应的获取错误信息的函数。比如这样:
enum ErrorCode
{
ERROR_0,
ERROR_1,
ERROR_2,
ERROR_3
};
const char* get_error_info(enum ErrorCode error_code)
{
switch(error_code)
{
case ERROR_0:
return "error info 0";
case ERROR_1:
return "error info 1";
case ERROR_2:
return "error info 2";
case ERROR_3:
return "error info 3";
}
return "";
}
还有一种方法是这样:
enum
{
ERROR_0,
ERROR_1,
ERROR_2,
ERROR_3
};
const char* error_info[] =
{
"error info 0",
"error info 1",
"error info 2",
"error info 3"
};
但以上这种方式若增加了ERROR_4后没有在error_info中增加响应内容,则造成数组下标越界!
于是有人创造了X宏的方式,这利用了C语言本身的预处理机制
test.h
#ifndef _TEST_H_
#define _TEST_H_
#define NUMBER X(One,"One") X(Two,"Two") X(Three,"Three")
#define X(a,b) a,
enum Number { NUMBER };
#undef X
extern const char *NumberStrings[];
#endif // _TEST_H_
test.c
#include "test.h"
#define X(a, b) b,
const char *NumberStrings[] = {NUMBER};
#undef X
使用以上方法的时候就可以在头文件中扩展NUMBER宏的枚举和关联内容的定义。
这个技巧不局限于枚举与字符串的关联,也可以是枚举与任何类型的关联内容。