c 语言 字符 宏 枚举,如何将枚举名称转换为c中的字符串

非连续枚举 h2>

由于我想将错误代码定义映射到数组字符串,因此我可以将原始错误定义附加到错误代码(例如"The error is 3 (LC_FT_DEVICE_NOT_OPENED)."),我以这样的方式扩展代码,您可以轻松地确定相应枚举的所需索引值:

#define LOOPN(n,a) LOOP##n(a)

#define LOOPF ,

#define LOOP2(a) a LOOPF a LOOPF

#define LOOP3(a) a LOOPF a LOOPF a LOOPF

#define LOOP4(a) a LOOPF a LOOPF a LOOPF a LOOPF

#define LOOP5(a) a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF

#define LOOP6(a) a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF

#define LOOP7(a) a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF

#define LOOP8(a) a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF

#define LOOP9(a) a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF a LOOPF

#define LC_ERRORS_NAMES \

Cn(LC_RESPONSE_PLUGIN_OK, -10) \

Cw(8) \

Cn(LC_RESPONSE_GENERIC_ERROR, -1) \

Cn(LC_FT_OK, 0) \

Ci(LC_FT_INVALID_HANDLE) \

Ci(LC_FT_DEVICE_NOT_FOUND) \

Ci(LC_FT_DEVICE_NOT_OPENED) \

Ci(LC_FT_IO_ERROR) \

Ci(LC_FT_INSUFFICIENT_RESOURCES) \

Ci(LC_FT_INVALID_PARAMETER) \

Ci(LC_FT_INVALID_BAUD_RATE) \

Ci(LC_FT_DEVICE_NOT_OPENED_FOR_ERASE) \

Ci(LC_FT_DEVICE_NOT_OPENED_FOR_WRITE) \

Ci(LC_FT_FAILED_TO_WRITE_DEVICE) \

Ci(LC_FT_EEPROM_READ_FAILED) \

Ci(LC_FT_EEPROM_WRITE_FAILED) \

Ci(LC_FT_EEPROM_ERASE_FAILED) \

Ci(LC_FT_EEPROM_NOT_PRESENT) \

Ci(LC_FT_EEPROM_NOT_PROGRAMMED) \

Ci(LC_FT_INVALID_ARGS) \

Ci(LC_FT_NOT_SUPPORTED) \

Ci(LC_FT_OTHER_ERROR) \

Ci(LC_FT_DEVICE_LIST_NOT_READY)

#define Cn(x,y) x=y,

#define Ci(x) x,

#define Cw(x)

enum LC_errors { LC_ERRORS_NAMES TOP };

#undef Cn

#undef Ci

#undef Cw

#define Cn(x,y) #x,

#define Ci(x) #x,

#define Cw(x) LOOPN(x,"")

static const char* __LC_errors__strings[] = { LC_ERRORS_NAMES };

static const char** LC_errors__strings = &__LC_errors__strings[10];在此示例中,C预处理器将生成以下代码:

enum LC_errors { LC_RESPONSE_PLUGIN_OK=-10, LC_RESPONSE_GENERIC_ERROR=-1, LC_FT_OK=0, LC_FT_INVALID_HANDLE, LC_FT_DEVICE_NOT_FOUND, LC_FT_DEVICE_NOT_OPENED, LC_FT_IO_ERROR, LC_FT_INSUFFICIENT_RESOURCES, LC_FT_INVALID_PARAMETER, LC_FT_INVALID_BAUD_RATE, LC_FT_DEVICE_NOT_OPENED_FOR_ERASE, LC_FT_DEVICE_NOT_OPENED_FOR_WRITE, LC_FT_FAILED_TO_WRITE_DEVICE, LC_FT_EEPROM_READ_FAILED, LC_FT_EEPROM_WRITE_FAILED, LC_FT_EEPROM_ERASE_FAILED, LC_FT_EEPROM_NOT_PRESENT, LC_FT_EEPROM_NOT_PROGRAMMED, LC_FT_INVALID_ARGS, LC_FT_NOT_SUPPORTED, LC_FT_OTHER_ERROR, LC_FT_DEVICE_LIST_NOT_READY, TOP };

static const char* __LC_errors__strings[] = { "LC_RESPONSE_PLUGIN_OK", "" , "" , "" , "" , "" , "" , "" , "" "LC_RESPONSE_GENERIC_ERROR", "LC_FT_OK", "LC_FT_INVALID_HANDLE", "LC_FT_DEVICE_NOT_FOUND", "LC_FT_DEVICE_NOT_OPENED", "LC_FT_IO_ERROR", "LC_FT_INSUFFICIENT_RESOURCES", "LC_FT_INVALID_PARAMETER", "LC_FT_INVALID_BAUD_RATE", "LC_FT_DEVICE_NOT_OPENED_FOR_ERASE", "LC_FT_DEVICE_NOT_OPENED_FOR_WRITE", "LC_FT_FAILED_TO_WRITE_DEVICE", "LC_FT_EEPROM_READ_FAILED", "LC_FT_EEPROM_WRITE_FAILED", "LC_FT_EEPROM_ERASE_FAILED", "LC_FT_EEPROM_NOT_PRESENT", "LC_FT_EEPROM_NOT_PROGRAMMED", "LC_FT_INVALID_ARGS", "LC_FT_NOT_SUPPORTED", "LC_FT_OTHER_ERROR", "LC_FT_DEVICE_LIST_NOT_READY", };这导致以下实现功能:

LC_errors__strings[-1]

==> LC_errors__strings[LC_RESPONSE_GENERIC_ERROR]

==> "LC_RESPONSE_GENERIC_ERROR"

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值