初始化结构的字段

时间:2015-11-25 20:37:18

标签: c macros initialization structure

我正在处理哈希表分配,并且在尝试使用宏值初始化结构变量时遇到意外错误。这是我的代码:

#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

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

2 个答案:

答案 0 :(得分:3)

您尝试初始化struct 定义中的成员,该成员是类型 1 。这是没有变量定义,并且在运行时不会占用任何内存,请注意。您根本没有定义任何变量,因此无需初始化。

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

执行类似操作
struct SymTable table = { .tablesize = DEFAULT_TABLE_SIZE, .counter = 1 };

此功能仅在C99之后可用,但是(GCC将其实现为自C90以来不符合的扩展名!)。另一个,&lt; C99方式,会有点笨重

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

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

1 感谢@ M.M提供的整洁措辞!

答案 1 :(得分:2)

您正尝试在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来声明的struct symTable somename;具有未初始化的内容,并且您无法对其进行任何操作。您可以通过宏来完成,但是在创建对象时需要显式调用宏。

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

这种方法有一些缺点:您只能使用它来初始化结构,您不能使用此语法稍后分配值。此外,没有类型检查。解决这些缺陷的一种方法是从函数返回一个值。好的编译器会将它优化为相同的代码。

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();