您能解释一下这段代码的作用以及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
};
答案 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
值的类型为int
,ARG
的值为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';