C结构声明中的数组

时间:2017-11-29 20:53:57

标签: c struct types declaration

您能解释一下这段代码的作用以及struct声明的工作原理吗?

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 个答案:

答案 0 :(得分: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值的类型为intARG的值为0;每个后续enum成员的值都大于它之前的值。必须预期enum永远不会变得如此之大,以至于成员值无法存储在char中,因此char中的struct成员用于保持这个价值。这似乎可以通过使用char成员而不是int tok成员来节省内存,但这只会在严重受内存限制的环境中产生影响,或者许多此类commands structs被使用的地方。

请注意,以这种方式初始化可能会在某些编译器上触发警告:

  

警告:初始化程序[-Wmissing-braces]

周围缺少大括号

最好在个别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}
    };

这将使缺少的大括号警告变得安静,并为代码添加一些清晰度。另一种方法是使用指定的初始化语法,以便更加清晰:

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 struct_name variable_name;

可以使用结构变量和点(。)运算符

访问结构中的变量
  

commands.tok ='a';