2017-11-29 31 views
1

このコードの機能と、struct宣言の仕組みを説明できますか?限り構造が考慮されるようにCの構造体宣言の配列

enum tokens 
{ 
    ARG, CHAR, INT, IF, ELSE, FOR, DO, WHILE, 
    SWITCH, RETURN, EOL, FINISHED, END 
}; 

[...]

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

答えて

2

私はこのような独立した声明の中で定義された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のメンバーを使用してメモリを節約する方法として考えられていますが、メモリが逼迫した環境や、多くの場合はcommandsstructsなどの多くの場合にのみ影響します。この方法を初期化すると、いくつかのコンパイラで警告が発せられることが

注:

警告:欠落している初期の周りにカッコ[-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} 
    }; 
1

、構造体はユーザー定義のデータ型です。 複数のプリミティブデータ型を1つの名前でグループ化することができます。 というキーワードは、というキーワードのすぐ隣に、のという名前です。 指定したサンプルコードを考慮すると、コマンドは、です。 構造体内の変数を値として初期化することはできません。 構造体変数を宣言する構文は、

struct struct_name variable_nameです。 (。)構造内

変数は構造変数とドット演算子

commands.tok = 'A' を使用してアクセスすることができます。

関連する問題