2012-01-22 4 views
3

を有することの利点/配慮は、私は、このようなCコードを横切って走っ何:無名配列

static char *mem_types[M_CNT] = { 
    [M_ABC] = "abc", 
    [M_DEF] = "DEF", 
    [M_XYZ] = "XYZ", 
}; 

M_CNTマクロ定数です。 M_ABC、M_DEF、M_XYZはすべてenumです。

このような宣言は、私には奇妙に見えるか、むしろ、このような文字列配列を宣言することの利点が何であるか疑問に思っています。私は単にそれを置くだろう

static char *mem_types[M_CNT] = { 
    "abc", 
    "DEF", 
    "XYZ", 
}; 

私が考えることができる唯一のことは、宣言は正確に各文字列のサイズを制限することができます。

その他の考慮事項はありますか?

+1

"宣言は各文字列のサイズを正確に制限できます" - それはどういう意味ですか? –

+0

@my_question:これらの括弧で囲まれたものは、各文字列の長さではなく、メイン配列のインデックスです。 C++では使用できません。 –

+0

C++タグが削除されました。これはC99ですが有効ではありません。C++ –

答えて

3

を参照しようとしているかどうかを把握することに望ましいだろう列挙型の値を並べ替える。これはどのように動作するかを示したものです。

#include <stdio.h> 

enum { 
    aa, bb, cc 
}; 

static char *mem_types[3] = { 
    [aa] = "abc", 
    [cc] = "DEF", 
    [bb] = "XYZ", 
}; 

int main() { 
    int i; 
    for (i = 0 ; i != 3 ; i++) { 
     printf("%s\n", mem_types[i]); 
    } 
} 

これはプログラムが印刷したものです。 XYZDEFは、enumの順番に一致するように場所が切り替わったことに注意してください。

abc 
XYZ 
DEF 
1

新しい行が時々配列に挿入される場合、[M_ABC]バージョンでは、対応するデータが配列内に存在する行に列挙された値が保持されます。さらに、このコードを読んでいる開発者には、列挙型が実際の配列定義と必ず同期していることを示すシグナルが提供されます。

これはどこかmem_types[1]、たとえば、コードの参照を持つ、これがあなたのコードが免疫になり、古い意味や魔法定数の新しい意味1.