0

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

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

4

4 回答 4

7

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

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

  • 手动进行
  • 构建过程中某种形式的代码生成步骤。在您的情况下,应该可以通过解析头文件来实现sed(假设您正在使用 Linux)。
于 2012-06-06T13:50:25.133 回答
2

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

你可以看看博文“枚举、字符串和懒惰”中的想法;它有一些可能对您有所帮助的想法。(这与Oli Charlesworth提到的 Dobbs 博士的X-Macros密切相关;那里的文章声称该技术可以追溯到 60 年代,尽管它必须使用 C 以外的语言,因为当时 C 不存在。 )

于 2012-06-06T13:55:01.427 回答
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);
    }
  }
}

}

于 2012-06-06T13:54:46.700 回答
0

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

于 2012-06-06T13:55:33.573 回答