Typedef枚举到C中的字符串

时间:2016-02-01 06:36:11

标签: string enums typedef

我有错误的typedef,如下所示。

typedef enum {  Connection_Error
    , Parity_Error
    , Data_Read_Error 
     } error_t;

我有一个返回“error_t”的函数。我想将枚举更改为字符串(最好不使用开关(大小写))。

EG。

char str[20];
str = function_to_convert_to_string (error_t);

这样的事情。 有什么建议吗?

1 个答案:

答案 0 :(得分:1)

C语言没有任何内置规定在输出二进制程序中将符号名称存储为字符串(与具有.ToString()方法的Java和C#不同)因此您必须在代码中手动执行此操作 - 幸运的是,使用预处理器将符号转换为字符串文字("字符串化")的能力使它变得更容易。

请注意,typedef enum { ... } name是不必要的,并且避免使用_t作为POSIX规范保留的后缀。

试试这个:

enum errorType {
    Connection_Error,
    Parity_Error,
    Data_Read_Error
};

#define ERRMSG( ARG ) \
case ARG: \
    return "Error: " #ARG ".";

char* getErrorMessage(errorType e) {
    switch(e) {
        ERRMSG( Connection_Error )
        ERRMSG( Parity_Error )
        ERRMSG( Data_Read_Error )
        default: exit(1); // or some other error handler
    }
}

请注意您如何在代码中手动列出两次枚举:首先在enum定义中,然后再在switch块中。对于小型枚举,这很好,但如果您的枚举列表很大或经常更改,您将要采用DRY方法。您可以通过在自己的文本文件中列出所有枚举来简化它,如下所示:

ErrorTypeEnum.inc

 ENTRY( Connection_Error )
 ENTRY( Parity_Error )
 ENTRY( Data_Read_Error )

ErrorTypeEnum.h

 #define ENTRY(NAME) NAME,
 enum errorType {
 #include "ErrorTypeEnum.inc"
     _Last
 }
 #undef ENTRY

由于尾​​随逗号,因此需要_Last条目,还提供了获取计数f元素的方法,因为_Last的数值等于上一个ENTRY + 1

ErrorTypeEnum.c

char* getErrorMessage(errorType e) {
    switch(e) {
#define ENTRY(NAME) case NAME: return "Error: " #NAME ".";
#include "ErrorTypeEnum.inc"
        default: exit(1); // or some other error handler
#undef
    }
}

另外

您可以通过向ENTRY宏添加其他值来扩展此功能,例如自定义的人类可读错误消息(而不是使用字符串化)。这是一个留给读者的练习:)