Вопрос по c-preprocessor, c – отображение #define значений в C

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 */

Я мог бы использовать для этого многое, но мне было интересно, есть ли более умный способ. Обратите внимание, что в любом случае я не могу изменить содержимое файла заголовка библиотеки.

Ваш Ответ

4   ответа
0

проанализировав эти определения на некотором языке сценариев. Должно быть легко перевести эти определения в объявление константного массива кода, строковые структуры которого вы можете затем перебрать.
Предполагая, что библиотека не меняется часто, вам нужно будет сделать это только один раз, поэтому вам не нужно сильно беспокоиться об основности скриптов и т. Д.

7

X-macros являются одним из возможных решений.

Но если вы не можете изменить заголовок, тогда у вас есть только два варианта (AFAIK):

Doing it manually Some form of code generation step in your build process. In your case, it should probably be possible by parsing the header file with sed (assuming you're working on Linux).
Надеюсь, разбор с cpp (cc -E)! Используйте sed для извлечения имен макросов и cpp для извлечения значений, иначе вы сойдете с ума (или сделаете тонкие ошибки подстановки).
Я боялся этого вздоха. К сожалению, изменение заголовка исключено. user1394234
Итак, прочитав все это, я должен спросить, почему он использует два параметра для егоX макрос? Может ли он просто получить имя в виде литерала с#a?
2

жны сами сгенерировать список чисел и имен и предоставить функцию поиска для сопоставления числа и имени.

Вы можете взглянуть на идеи в блоге«Перечисления, строки и лень»;; у него есть некоторые идеи, которые могут вам помочь. (Это тесно связано сX-макросы у доктора Доббса, упомянутогоОли Чарльзуорт; в этой статье утверждается, что техника восходит к 60-м годам, хотя она должна была быть на языке, отличном от C, так как C тогда еще не существовало.)

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

}

Мне придется сделать что-то подобное только user1394234

Похожие вопросы