在C中显示#define值

时间:2012-06-06 13:47:29

标签: c c-preprocessor

我有一系列来自此类库文件头的#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 */

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

4 个答案:

答案 0 :(得分:7)

人们似乎对他们情有不同,但X-macros是一种可能的解决方案。

但如果您无法更改标题,那么您只有两个选项(AFAIK):

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

定义如下结构:

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);
    }
  }
}

}

答案 3 :(得分:0)

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