C中的奇数错误;期待什么

时间:2011-08-04 21:44:30

标签: c variables

我在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

发生了什么事?

4 个答案:

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