我在C中编写一种小语言,它需要变量设置。我有一个变量表设置,但我收到一个奇怪的错误。
#define VAR_SIZE 100
typedef struct {
const char *key;
int value;
} variable;
variable Table[VAR_SIZE];
Table[0].key = NULL;
Table[0].value = 0;
当我运行时,我收到以下错误:
stack.c:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token
stack.c:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token
发生了什么事?
答案 0 :(得分:7)
您正尝试在全球范围内编写代码。你不能这样做。您需要为全局变量提供静态初始化程序,或者在函数调用内的运行时初始化它。
静态初始化程序的一个示例:
variable Table[VAR_SIZE] = {
{NULL, 0}, // index 0
{NULL, 0}, // index 1
// etc.
};
在运行时初始化:
variable Table[VAR_SIZE];
void init_table(void) {
Table[0].key = NULL;
Table[0].value = 0;
// etc.
}
int main(int argc, char **argv) {
init_table();
// rest of program
}
如果您在C99模式下进行编译,还可以使用指定的初始化程序:
// The following is valid C99, but invalid C89 and invalid C++
variable Table[VAR_SIZE] = {
[0] = { // initialize index 0
.key = NULL,
.value = 0
},
// etc.
};
答案 1 :(得分:3)
您不能在文件范围内拥有语句或表达式。你只能在功能范围内拥有它们。您需要将最后三行更改为:
struct variable Table[VAR_SIZE] = { { NULL, 0 }, };
使用此语法初始化结构或数组时,任何未指定的字段都会初始化为零,就像在结构/数组的其余部分上执行memset(..., 0, sizeof(...));
一样。所以你可以在结构中添加字段,它仍然可以编译。
顺便说一句,在C中, struct
名称存在于他们自己的名称空间中,您需要在其前面添加struct
关键字。
答案 2 :(得分:0)
您只能在函数内部访问它。要在全球范围内这样做,请尝试:
variable Table[VAR_SIZE] = {{NULL,0},{NULL,0}};
如果在一个函数内部没问题,那么要么做你已经完成的事情,要么我会去做一个简单的事情:
memset(Table, 0, sizeof(Table));
答案 3 :(得分:0)
您可能必须在函数中初始化数组的0元素。 您可以在全局范围内声明和定义任何内容。但后两行是分配,只能在函数中出现
示例:(除了两行之外,其他任何事情就像你上面所做的那样:))
void test()
{
Table[0].key = NULL;
Table[0].value = 0;
}