初始化结构的字段
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();
我正在处理散列 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 起的不一致扩展!)。另一种 您需要知道成员的顺序和每个成员的默认值。 1 感谢@M.M 简洁的措辞! struct SymTable table = { NULL, DEFAULT_TABLE_SIZE, 1 };
您正试图在 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();