C语⾔使⽤宏⾃定义可打印的枚举(enum)类型
1. 前⾔:
说点废话,时间紧的请直接跳过,看后⾯的实现。
尽管本⼈很反感 C 语⾔中的宏定义,特别是滥⽤宏定义经常会让问题变的扑朔迷离,但是不得不承认,在某些时候,其的确是很好⽤的,就⽐如今天的例⼦。
我们代码中涉及到故障码或者状态机,很多⼈都会⽤宏定义或者枚举表⽰,我个⼈是⽐较倾向于后者的,当让是由于其能在编译阶段对重定义等问题的规避。但是呢,C 语⾔相⽐于其他的⾼级语⾔,对机器的友好更胜过对程序员的友好。常规的枚举类型,在编码阶段虽然⽐原始的魔幻数字直观很多,但是在调试阶段,不做特殊处理情况下默认打印的数字经常会把⼈搞晕,所以为了⾃⼰调试⽅便,今天尝试⽤宏定义实现⼀个⾃⼰的枚举类型,使得定义完成后可以在打印时可以打印出友好的字符串⽽不是数字。
2. 正⽂
1. 公共代码
// def_enums.h
#ifndef DEF_ENUMS_H
#define DEF_ENUMS_H
#define GENERATE_ENUM(ENUM) ENUM,
#define GENERATE_ENUM_STRING(STRING) #STRING,
enum类型如何使用// 定义枚举类型
#define DEF_ENUM_TYPE(name, ENUMS, start) \
enum ENUM_##name {                    \
name##_START = start,                \
ENUMS(GENERATE_ENUM)                  \
name##_END                            \
}
/
/ 定义枚举类型描述字符串
#define DEF_ENUM_STRING(name, ENUMS)  \
const char* name##_STR[] = {      \
#name##"_start"              \
ENUMS(GENERATE_ENUM_STRING)  \
#name##"_end"                \
}
#endif
2. 使⽤⽰例
// main.c
#include<stdio.h>
#include"def_enums.h"
/* ⽤户使⽤⽰例 */
// 头/源⽂件中定义
#define USER_ENUMS(GENERATE)                    \
GENERATE(ENUM_1)                            \
GENERATE(ENUM_2)                            \
GENERATE(ENUM_3)                            \
GENERATE(ENUM_4)                            \
GENERATE(ENUM_5)
DEF_ENUM_TYPE(MY_ENUM, USER_ENUMS,0);
extern const char* MY_ENUM_STR[];
/
/ 在源⽂件中定义
DEF_ENUM_STRING(MY_ENUM, USER_ENUMS);// 注意要定义在源⽂件中,不能定义到头⽂件
int main()
{
ENUM_MY_ENUM tmp = ENUM_2;
printf("tmp = %s\n", MY_ENUM_STR[tmp]);
// 循环打印枚举值
for(int i = MY_ENUM_START; i <= MY_ENUM_END; i++)
{
printf("%d = %s\n", i, MY_ENUM_STR[i]);
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。