初始化结构的字段

Initializing fields of a structure

我正在处理散列 table 赋值,但在尝试使用宏值初始化结构变量时出现意外错误。这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "symTable.h"
#define DEFAULT_TABLE_SIZE 61
#define HASH_MULTIPLIER 65599

typedef struct Node
{
    char *key;
    int *value;
    struct Node *next;
} Node_T;

typedef struct SymTable
{
    Node_T **Table;
    int tablesize = DEFAULT_TABLE_SIZE; //where I am getting my error
    int counter = 1;
} *SymTable_T;

我得到的错误是

error: expected ':', ',', ';', '}' or '__attribute__' before '=' token

有人可以向我解释为什么它不接受我的宏值吗?

您尝试在struct定义中初始化一个成员,它是类型1 。请注意,这是 no 变量定义并且在运行时不会占用任何内存。你根本没有定义任何变量,所以没有什么要初始化的。

实际定义变量时,您可以使用 designated initializer list:

做类似的事情
struct SymTable table = { .tablesize = DEFAULT_TABLE_SIZE, .counter = 1 };

此功能仅自 C99 起可用,但是(GCC 将其实现为 自 C90 起的不一致扩展!)。另一种

struct SymTable table = { NULL, DEFAULT_TABLE_SIZE, 1 };

您需要知道成员的顺序每个成员的默认值。


1 感谢@M.M 简洁的措辞!

您正试图在 struct SymTable 的定义中使用赋值。这是一种结构,即一种类型。您不能将值分配给类型或类型的一部分:类型不是存储的一部分,而是存储的分类。

您可以在定义 struct SymTable 类型的对象时使用赋值。您可以分配所有字段;如果你省略了一些字段,你省略的字段将被初始化为“零”(意味着 0 用于整数字段,0.0 用于浮点字段,NULL 用于指针字段)。

struct SymTable syms1 = {NULL, DEFAULT_TABLE_SIZE, 1};
struct SymTable syms2 = {.counter = 1, .tablesize = DEFAULT_TABLE_SIZE};

我在 syms2 中使用的语法是在 C99 中引入的,大多数但不是所有常见的编译器都支持它)。我用于 syms1 的语法自古以来就存在;它的缺点是您需要按顺序为字段提供值。

如果您尝试为 struct symTable 类型的任何新对象提供默认值,这不是 C 本身提供的功能。通过在函数中写入 struct symTable somename; 声明的 struct symTable 具有未初始化的内容,您无能为力。您可以通过宏来实现,但您需要在创建对象时显式调用宏。

#define STRUCT_SYMTABLE_DEFAULT {NULL, DEFAULT_TABLE_SIZE, 1}
…
struct symTable syms3 = STRUCT_SYMTABLE_DEFAULT;

这种方法有一些缺点:您只能使用它来初始化结构,以后不能使用这种语法来赋值。此外,没有类型检查。修复这些缺陷的一种方法是 return 来自函数的值。好的编译器会将其优化为相同的代码。

struct symTable inline symTable_default(void) {
    struct symTable default = {NULL, DEFAULT_TABLE_SIZE, 1};
    return default;
}
…
struct symTable syms4 = symTable_default();
…
/* Reset the table to its default value */
syms4 = symTable_default();