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 マクロは 1 つの可能な解決策です。

ただし、ヘッダーを変更できない場合、2 つのオプション (AFAIK) は次のとおりです。

  • 手動で行う
  • ビルド プロセスでの何らかの形式のコード生成ステップ。あなたの場合、ヘッダーファイルを解析することでおそらく可能になるはずsedです(Linuxで作業していると仮定します)。
于 2012-06-06T13:50:25.133 に答える
2

それを行うための単純または自動的な方法はありません。番号と名前のリストを自分で生成し、番号と名前をマッピングするルックアップ関数を提供する必要があります。

ブログ記事「Enums, Strings and Laziness」のアイデアを参照してください。それはあなたを助けるかもしれないいくつかのアイデアを持っています. (これは、 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 に答える