结构混乱

Roh*_*uja 6 c struct declaration definition

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

任何人都可以解释

struct A
{
   int a;
   char b;
   float c;
};
Run Code Online (Sandbox Code Playgroud)

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

Jen*_*ens 11

它声明了一个带有struct标签A和指定成员的结构.它既没有定义也没有为对象保留任何存储空间.

根据C99标准,6.7声明:

语义

5声明指定一组标识符的解释和属性.标识符的定义是该标识符的声明:

- 对于一个对象,导致为该对象保留存储;

- 对于一个功能,包括功能体; (脚注98)

- 对于枚举常量或typedef名称,是标识符的(唯一)声明.

对于定义,您需要在最终分号之前提供对象标识符:

struct A
{
   int a;
   char b;
   float c;
} mystruct;
Run Code Online (Sandbox Code Playgroud)

要初始化mystruct,你会写

struct A
{
   int a;
   char b;
   float c;
} mystruct = { 42, 'x', 3.14 };
Run Code Online (Sandbox Code Playgroud)


Moh*_*ain 3

这是一个宣言。

struct A;前向声明或不完整声明。

struct A
{
   int a;
   char b;
   float c;
};
Run Code Online (Sandbox Code Playgroud)

是完整的struct声明。

例子

另请检查comp.lang.c 常见问题解答列表问题 11.5

在前向声明 后struct,您可以使用结构体指针,但不能取消引用指针或使用sizeof运算符或创建 的实例struct

声明后,您还可以使用struct对象、应用sizeof运算符等。


来自C11 规范的6.7.2.1 结构和联合说明符

8 直到紧接终止列表的 } 之后,该类型才完整,此后才完整。

以及从6.7.2.3 标签开始

如果形式
struct-or-union 标识符的类型说明符不是作为上述形式之一的一部分出现,并且没有其他标识符作为标记的声明可见,则它声明不完整的结构或联合类型,并声明标识符作为该类型的标签。131 )
131不存在与 enum 类似的结构


这不应该与extern struct A aa;v/s 混淆,v/sstruct A aa ={/*Some values*/};是 object 的声明和定义aa

  • 你很困惑;`struct a ={//Some value};` 甚至是一个语法错误(不是由于注释,而是因为您无法分配给 **标签** 名称。) (2认同)