私はこのような独立した声明の中で定義されたtable
を参照してくださいすることを好む:
struct commands
{
char command[20];
char tok;
};
struct commands table[] =
{
"if", IF,
"else", ELSE,
"for", FOR,
"do", DO,
"while", WHILE,
"char", CHAR,
"int", INT,
"return", RETURN,
"end", END,
"", END
};
効果は同じです。 table[]
は、struct commands
要素の配列で、初期化子リストの値で初期化されます。 enum
の値はタイプint
で、ARG
の値は0です。各後続のenum
メンバは、それより前の値より1大きい値を持ちます。 enum
はそれほど大きくならず、メンバー値をchar
に格納できないため、のchar
メンバーがこの値を保持するために使用されます。これは、tok
のメンバーであるint
の代わりにchar
のメンバーを使用してメモリを節約する方法として考えられていますが、メモリが逼迫した環境や、多くの場合はcommands
structs
などの多くの場合にのみ影響します。この方法を初期化すると、いくつかのコンパイラで警告が発せられることが
注:
警告:欠落している初期の周りにカッコ[-Wmissing-ブレース]
個々の周りにカッコを配置する方が良いだろうstruct
初期化子:
struct commands
{
char command[20];
char tok;
}
table[] =
{
{"if", IF},
{"else", ELSE},
{"for", FOR},
{"do", DO},
{"while", WHILE},
{"char", CHAR},
{"int", INT},
{"return", RETURN},
{"end", END},
{"", END}
};
これは行方不明中括弧の警告を静かにいくつかの明快さを追加しますコード。もう1つの方法は、指定されたイニシャライザ構文を使用してさらに明確にすることです。
struct commands
{
char command[20];
char tok;
}
table[] =
{
{.command = "if", .tok = IF},
{.command = "else", .tok = ELSE},
{.command = "for", .tok = FOR},
{.command = "do", .tok = DO},
{.command = "while", .tok = WHILE},
{.command = "char", .tok = CHAR},
{.command = "int", .tok = INT},
{.command = "return", .tok = RETURN},
{.command = "end", .tok = END},
{.command = "", .tok = END}
};