c-结构混乱



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

有人能解释一下吗

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

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

它声明了一个具有结构标记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 };

这是一个声明。

struct A;是正向声明或不完整声明。

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

是完整的struct声明。

示例

另请查看comp.lang.cFAQ列表问题11.5

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

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


来自6.7.2.1结构和并集说明符来自C11规范

8在终止的}之后,类型才是不完整的列表,然后完成。

以及6.7.2.3标签

如果出现
结构或联合标识符形式的类型说明符除了作为上述表格的一部分,没有其他声明如果标识符作为标记可见,则它声明不完整结构或联合类型,并将标识符声明为这种类型131
131[/sup>不存在具有enum的类似构造


这不应与extern struct A aa; v/s struct A aa ={/*Some values*/};混淆,后者是对象aa的声明和定义。

最新更新