在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等烦恼。