c - 从 C 项目中提取所有枚举的最佳方法

标签 c enums

我正在编写自己的基于枚举的回溯。基本上每个函数调用都会将其错误附加到预定义的堆栈中,该堆栈最终将包含所有函数调用中的所有错误。

我想创建一种有效的方法来解析它。最后,我得到了 int backtrace[] ,其中包含来自整个代码库的枚举值,并且我想将每个枚举值与其名称相关联。

这当然应该在失败后完成(而不是在运行时),所以我缺少的是一种方法,也许作为编译步骤的一部分,将我的所有枚举和值转储到文件中。然后我可以编写一个解析错误的脚本。

是否有一个简单的(跨平台)静态工具可以做到这一点?

最佳答案

不确定如何记录错误,但是怎么样:

typedef enum
{
  E_SUCCESS = 0,
  E_FAIL,
...
} error_t;

typedef struct
{
  error_t code;
  char * error_name;
} backtrace_entry_t;

backtrace_entry_t backtrace[..];


#define FUNC_EXIT(error_code__) \
do { \
  backtrace[func_id].code = (error_code__); \
  backtrace[func_id].error_name = #error_code__; \
} while (0)

然后,当您调用 FUNC_EXIT(E_SUCCESS); 时,您将得到该函数的回溯:{.code = 0, .error_name = "E_SUCCESS"}

问题是,如果调用 FUNC_EXIT(var);,则无法获得正确的名称,其中 var 是某个局部变量。

<小时/>

另一种选择,尽管仍然不是自动的:

typedef enum
{
  E_SUCCESS = 0,
  E_FAIL,
...
  NOF_ERROR_CODES
} error_t;

#define MAP_E_CODE_TO_NAME(error_code__)  [error_code__] = #error_code__

const char * error_to_name_mapping[NOF_ERROR_CODES] = {
  MAP_E_CODE_TO_NAME(E_SUCCESS),
  MAP_E_CODE_TO_NAME(E_FAIL),
...
};

将给出一个带有 {"E_SUCCESS", "E_FAIL", ...}const char * 数组,您可以像这样使用:

printf("The name of error code %d is '%s'", error, error_to_name_mapping[error]);

这里的问题是,随着值的增加,您必须对错误具有正值。

关于c - 从 C 项目中提取所有枚举的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55932786/

相关文章:

c - 在头文件中声明时无法识别结构

c - 排序指向结构的指针数组 qsort

c - 如何禁用 GtkColorButton?

mysql - 在 MySQL 中使用字符串枚举 - 性能问题

swift - 如何创建具有有限可能性的数据类型来打开其值?

android - Dexguard/Proguard 使应用程序在 Enum 开关上崩溃

c - 使用 regexec 进行分组

将字符映射表从主机内存复制到 CUDA 中的设备

java - Android 枚举反射

java - 识别构造函数中的特定枚举