4

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

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

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

我过去曾尝试将其删除,但没有注意到行为上的差异,但我不确定删除它是否安全。

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

sizeof(struct sockaddr)
sizeof(sockaddr)
4

4 回答 4

5

作为一种编码“风格”,这很可能是 C 的遗产,其中关键字是必要的。

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

struct x
{
};

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

就个人而言,我不认为拥有变量或与类型同名的函数是好的风格,我更愿意完全避免struct为此目的使用关键字,但语言允许这样做。

于 2013-06-21T21:03:34.360 回答
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()
}

于 2013-06-21T21:06:05.530 回答
1

诸如此类的代码直接来自 C(很可能通过复制和粘贴),其中struct关键字必须在定义为结构的任何类型的名称之前(除非您添加适当的typedef语句)。struct为了向后兼容,C++ 仍然支持以这种方式使用,但是因为struct foo { ... };在 C++ 中自动添加foo为类型名称,所以(通常)之后将类型引用为foo.

于 2013-06-21T21:04:18.960 回答
1

您在很大程度上是正确的;在 C++ 中,struct 关键字几乎与声明变量无关。

比你想知道的更多:在 C++ 中的变量声明中使用 struct 关键字

于 2013-06-21T21:04:50.583 回答