结构混乱

时间:2015-02-27 09:39:10

标签: c struct declaration definition

有一段时间我没有接触过C语言,所以我只是经历了一些概念但却找不到任何好的结构来源。

任何人都可以解释

struct A
{
   int a;
   char b;
   float c;
};

这是结构A的声明或定义。

2 个答案:

答案 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的声明和定义。