有一段时间我没有接触过C语言,所以我只是经历了一些概念但却找不到任何好的结构来源。
任何人都可以解释
struct A
{
int a;
char b;
float c;
};
这是结构A
的声明或定义。
答案 0 :(得分:11)
它声明了一个带有struct标签A
和指定成员的结构。它既没有定义也没有为对象保留任何存储空间。
根据C99标准,6.7声明:
<强>语义强>
5声明指定一组的解释和属性 身份标识。标识符的定义是对此的声明 标识符:
- 对于一个对象,导致保留存储空间 那个对象;
- 对于一个函数,包括函数体; (脚注98)
- 对于 枚举常量或typedef名称,是(唯一)声明的 标识符
对于定义,您需要在最后一个分号之前提供对象标识符:
struct A
{
int a;
char b;
float c;
} mystruct;
要初始化mystruct,你会写
struct A
{
int a;
char b;
float c;
} mystruct = { 42, 'x', 3.14 };
答案 1 :(得分:3)
这是宣言。
struct A;
是forward declaration或不完整的声明。
struct A
{
int a;
char b;
float c;
};
是完整的struct
声明。
<强> Example 强>
同时检查comp.lang.c FAQ list Question 11.5
在struct
的前向声明之后,您可以使用结构指针,但不能取消引用指针或使用sizeof
运算符或创建struct
的实例。
声明后,您还可以使用struct
个对象,应用sizeof
运算符等。
来自C11规范中的6.7.2.1结构和联合说明符
8直到}终止后,类型才会完整 列表,然后完成。
来自 6.7.2.3标签
如果出现形式为 struct-or-union identifier 的类型说明符 除了作为上述表格之一的一部分外,没有其他声明 标识符作为标记是可见的,然后它声明不完整 结构或联合类型,并将标识符声明为标记 该类型。 131 )
131 不存在与枚举类似的构造
这不应与extern struct A aa;
v / s struct A aa ={/*Some values*/};
混淆,后者是对象aa
的声明和定义。