【问题标题】:What does struct mean in variable definition? c++结构在变量定义中是什么意思? C++
【发布时间】:2014-08-07 20:06:24
【问题描述】:

Here我找到了一个看起来像这样的变量定义:

struct sockaddr *ai_addr;    

似乎定义了一个指向struct sockaddr类型变量的指针,但是

1)struct 是关键字

2)struct sockaddr test; 创建错误

aggregate 'sockaddr test' has incomplete type and cannot be defined

(我在 gcc 4.7.1 下工作)

【问题讨论】:

  • 我猜2) struct sockaddr ai_addrr; creates error 应该读作2) struct sockaddr test; creates error,不是吗?
  • 在 C(不是 C++!)中,structure 中的名称 struct structure 本身并不是一个类型。 struct structure 是类型(这就是为什么你会在 C 代码中看到 typedef struct structure structure_type)
  • @Alfonso Nishikawa。是的,改了。
  • @Dieter Lücking 我没有使用纯 C。谢谢。

标签: c++ c struct


【解决方案1】:

在此声明中

struct sockaddr *ai_addr; 

这里使用了所谓的详细类型说明符。这个声明做了两件事。首先它声明了类型名sockaddr,并声明了一个该类型的指针。

要声明指向结构的指针,不需要定义结构,因为它是一个完整的类型,因为指针的大小不依赖于结构的大小。

为此声明

struct sockaddr ai_addr;

编译器发出错误,因为它需要为struct sockaddr 类型的对象分配内存,但它不知道结构的大小,因为结构尚未定义。那就是结构是不完整的类型。它只是声明但尚未定义,它的大小是未知的。

【讨论】:

  • 对于struct sockaddr ai_addr 只需注释一下,如果未声明struct sockaddr 将抛出相同的错误。例如,如果忘记了正确的包含。
  • @Alfonso Nishikawa 详细类型说明符是一个声明。所以你不需要任何其他的结构声明。
  • 我只是在考虑忘记放置正确包含的可能性。在那种情况下,struct sockaddr ai_addr 将显示相同的错误……至少对于我的 gcc (4.8.2)。你的答案是正确的,这一点毫无疑问。
【解决方案2】:

struct 并不是真正的简单数据类型。它是一种相当复杂的数据类型,其工作方式类似于数据结构,您可以在其中将不同类型的数据保存在一起。例如,如果你想将名片的数据保存在一个结构体中(由 struct 关键字声明),你可以这样定义:

struct bizcard {
  char name[30];
  char organization[50];
  char email[50];
};

另一个例子:

struct student {
  char name[30];
  int registration_no;
  float cgpa;
}

欲了解更多信息,请查看:http://en.wikipedia.org/wiki/Struct_(C_programming_language)

【讨论】:

  • 我以前使用的所有结构都可以定义为sockaddr test;,以防sockaddr 是结构。但在那里我无法创建sockaddr 变量。只有指向它的指针,并且只能在变量定义中使用 struct 关键字。
  • 你应该可以写struct sockaddr test;声明一个名为 test 的 sockaddr 类型的结构。
  • struct 不是真正的数据类型 也许在C 中,但在C++struct 是一种数据类型。
  • 你说得对,我应该写的,struct 并不是真正的简单数据类型。 :)
猜你喜欢
  • 1970-01-01
  • 2011-08-30
  • 2021-11-25
  • 2020-07-17
  • 2020-03-20
  • 1970-01-01
  • 2018-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多