我经常看到这样的 C++ 代码:
void foo()
{
struct sockaddr* from;
// ...
}
为什么struct
需要说明符?它真的有什么作用吗?编译器已经知道它sockaddr
被声明为结构,所以我想知道为什么这是有用或必要的。
我过去曾尝试将其删除,但没有注意到行为上的差异,但我不确定删除它是否安全。
同样,这两者有什么区别?
sizeof(struct sockaddr)
sizeof(sockaddr)
作为一种编码“风格”,这很可能是 C 的遗产,其中关键字是必要的。
在 C++ 中,这在大多数情况下是不需要的,尽管它有时用于强制编译器将名称解析为类型的名称,而不是其他实体的名称(如变量,如下例所示):
struct x
{
};
int main()
{
int x = 42;
struct x* pX = nullptr; // Would give a compiler error without struct
}
就个人而言,我不认为拥有变量或与类型同名的函数是好的风格,我更愿意完全避免struct
为此目的使用关键字,但语言允许这样做。
这种语法来自 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() }
诸如此类的代码直接来自 C(很可能通过复制和粘贴),其中struct
关键字必须在定义为结构的任何类型的名称之前(除非您添加适当的typedef
语句)。struct
为了向后兼容,C++ 仍然支持以这种方式使用,但是因为struct foo { ... };
在 C++ 中自动添加foo
为类型名称,所以(通常)之后将类型引用为foo
.
您在很大程度上是正确的;在 C++ 中,struct 关键字几乎与声明变量无关。
比你想知道的更多:在 C++ 中的变量声明中使用 struct 关键字