为什么在C ++中有一些以'struct'为前缀的本地类型声明

时间:2013-06-21 21:00:07

标签: c++ struct

我经常看到像这样的C ++代码:

void foo()
{
  struct sockaddr* from;
  // ...
}

为什么需要struct说明符?它真的做了什么吗?编译器已经知道sockaddr被声明为结构,所以我想知道为什么这是有用的或必要的。

我过去曾尝试删除它,并没有注意到行为上的差异,但我不相信它可以安全移除。

同样,这两者有什么区别?

sizeof(struct sockaddr)
sizeof(sockaddr)

4 个答案:

答案 0 :(得分:5)

作为编码"样式",这很可能是C的遗产,其中关键字是必要的。

在C ++中,在大多数情况下不需要这样做,尽管有时会强制编译器将名称解析为类型名称而不是某个其他实体的名称(如变量,如下例所示) ):

struct x
{
};

int main()
{
    int x = 42;
    struct x* pX = nullptr; // Would give a compiler error without struct
}

就个人而言,我不认为具有变量的好样式或具有与类型相同名称的函数,我更愿意为此目的而避免使用struct关键字,但语言允许它

答案 1 :(得分:4)

此语法来自C,这是必须的。 在C ++中,只需要使用一种语法

n3376 9.1 / 2

类声明将类名引入声明它的范围,并隐藏任何类,变量, 函数或该名称在封闭范围内的其他声明(3.3)。如果在作用域中声明了类名 其中还声明了同名的变量,函数或枚举器,然后是两个声明 在范围内,该类只能使用精心设计的类型说明符

来引用
struct stat {
// ...
};
stat gstat; // use plain stat to
// define variable
int stat(struct stat*); // redeclare stat as function
void f() {
struct stat* ps; // struct prefix needed
// to name struct stat
stat(ps); // call stat()
}

答案 2 :(得分:1)

这样的代码直接来自C(很可能是通过复制和粘贴),其中在定义为结构的任何类型的名称之前需要struct关键字(除非您添加适当的{ {1}}声明)。在C ++中仍然支持以这种方式使用typedef以实现向后兼容,但由于C ++中的struct会自动添加struct foo { ... };作为类型名称,因此(通常)可以安全地引用类型之后只是foo

答案 3 :(得分:1)

你基本上是正确的;在C ++中,struct关键字几乎与声明变量无关。

比你想知道的更多:using struct keyword in variable declaration in C++