我有如下错误类型定义。
typedef enum { Connection_Error
, Parity_Error
, Data_Read_Error
} error_t;
我有一个返回"error_t"的函数。我想将枚举更改为字符串(最好不使用开关(case((。
例如。
char str[20];
str = function_to_convert_to_string (error_t);
类似的东西。有什么建议吗?
语言没有任何内置条款用于在输出二进制程序中将符号名称存储为字符串(与具有 .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 )
错误类型枚举.h
#define ENTRY(NAME) NAME,
enum errorType {
#include "ErrorTypeEnum.inc"
_Last
}
#undef ENTRY
由于尾随逗号,需要_Last
条目,也提供了一种获取计数 f 元素的方法_Last
因为其数值等于最后一个 ENTRY
+ 1。
错误类型枚举.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 宏添加其他值来扩展此内容,例如自定义的人类可读错误消息(而不是使用字符串化(。这是留给读者的练习:)