2016-07-19 10 views
0

少し混乱します。本番環境では、すでに定義されているマクロはほとんどありません。これらのマクロはある値を返すために使われました。今我々の要件は、これらのマクロの価値に基づいていくつかのルックアップを準備することです。 char *配列を作成し、適切なインデックスに文字列を定義しました。しかし私のマネージャーは、これらのマクロを列挙型に変換してからルックアップするように頼んだ。列挙型を使ってこれを実装する方法は?それの利点は何ですか?これらのマクロは、多くの異なるファイルで使用されています。列挙型を定義した場合、何かを変更する必要がありますか? ありがとうございます!C言語のマクロをenum型に変換する

サンプルコード:

#define macro_1 1 
#define macro_2 2 
#define macro_3 3 
#define macro_4 4 

を検索:この使用して列挙型を実装する方法を

const char* lookup[] = {.....}; 
+0

一つの直接の利点は、アレイを使用して順次増加マクロ値(すなわち、0、1、2、3、4、...)が必要ということです。列挙型を使用する場合、値は任意の整数にすることができます。 –

+0

@Rushy Panchal:すぐに助けてくれてありがとう。私に例を教えてもらえますか?列挙型を使用してルックアップを行うことは可能ですか?列挙型で文字列を定義するにはどうすればよいですか? – Rock26

答えて

0

  1. あなたのマネージャーがマクロを列挙型にマップするよう依頼したとします。マクロはすべて整数値を持ち、列挙型の値はマクロと同じ名前を使用しないので、単に列挙型を定義できます。

  2. これの利点は何ですか?
    マクロは、コンパイラに入る前に値に置き換えられるので一般的には勧められません。コンパイラによってチェックおよび管理されるenum型を使用するのと比べて、エラーが発生しやすくなります。

  3. これらのマクロは、多くの異なるファイルで使用されています。列挙型を定義した場合、何かを変更する必要がありますか?
    残念ながらyesです。ただし、マクロが中央ヘッダファイル内で分離されている場合は、マクロの名前を変更し、元の名前を列挙型の名前に変更することで対処できます。

この記事が役立つ場合があります。 http://www.cs.utah.edu/~germain/PPS/Topics/C_Language/enumerated_types.html

一部コード

#include <stdio.h> 

#define old_macro_1 1 
#define old_macro_2 2 
#define old_macro_3 3 

enum MacroValues { 
    macro_1 = old_macro_1, 
    macro_2 = old_macro_2, 
    macro_3 = old_macro_3 
}; 

void test_macros(void) 
{ 
    const char* lookup[] = {"M0", "M1", "M2", "M3"}; 
    // use an enum variable directly 
    printf("enum MacrosValues %d\n", macro_1); 
    // define an enum variable to use as index 
    enum MacroValues m1 = macro_2; 
    printf("lookup[%d] = %s\n", m1, lookup[m1]); 
} 

int main(void) 
{ 
    test_macros(); 
    return 0; 
} 
関連する問題