在C中显示#define值

我有一系列来自这种库文件头的#defines:

typedef int Lib_error; #define LIB_ERROR_A ((Lib_error) 0x0000) #define LIB_ERROR_D ((Lib_error) 0x0100) #define LIB_ERROR_F ((Lib_error) 0x0200) #define LIB_ERROR_K ((Lib_error) 0x0300) #define LIB_ERROR_O ((Lib_error) 0x0400) #define LIB_ERROR_P ((Lib_error) 0x0500) #define LIB_ERROR_R ((Lib_error) 0x0600) #define LIB_ERROR_X ((Lib_error) 0x0700) #define LIB_ERROR_Y ((Lib_error) 0x0800) #define LIB_ERROR_M ((Lib_error) 0x0900) /* and so on */ 

有什么方法我可以打印这些值,所以例如

 uint MyError; /* printf("Error = %s",MyError); It should print the string LIB_ERROR_F instead of say 0x200 */ 

我可以使用很多其他的,但我想知道是否有一个更聪明的方式。 请注意,我无论如何都无法更改库头文件的内容。

人们似乎对它们有着复杂的感觉,但X-macro是一种可能的解决方案。

但是如果你不能改变标题,那么你唯一的两个选项(AFAIK)是:

  • 手动完成
  • 构建过程中的某种forms的代码生成步骤。 在您的情况下,应该可以通过使用sed解析头文件(假设您正在使用Linux)。

没有一种简单或自动的方法可以做到这一点。 您必须自己生成数字和名称列表,并提供查找函数以在数字和名称之间进行映射。

你可以看一下博客文章’Enums,Strings and Laziness’中的想法; 它有一些可能对你有帮助的想法。 (这与Oli Charlesworth提到的Dobbs博士的X-Macros密切相关;那篇文章声称这项技术可以追溯到60年代,尽管它必须使用C以外的语言,因为C当时不存在。 )

警告:以下代码只是一个示例。 你可以做很多即兴创作。 🙂

定义如下结构:

 typedef struct ErrorStorage { Lib_error err; char err_string[100]; }ErrNoStore; ErrNoStore arrErr[25]; arrErr[0].err = LIB_ERROR_A; strcpy(arrErr[0].err_string, "LIB_ERROR_A"); /... and so on .../ 

然后在代码中定义一个这样的函数并调用它

 void display_error(Lib_error errnum) { int i = 0; for(i=0; i<25;i++) { if(errnum == arrErr[i].err) { printf("%s\n", arrErr[i].err_string); } } } 

}

只需通过使用某种脚本语言解析这些定义来生成表。 应该很容易将这些定义转换为常量数组代码的声明,然后可以迭代的字符串结构。
假设库不经常更改,您只需要执行一次这样的操作,因此您不需要为脚本corectness等烦恼。