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

Why are some local type declarations prefixed with 'struct' in C++

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

1
2
3
4
5
void foo()
{
  struct sockaddr* from;
  // ...
}

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

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

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

1
2
sizeof(struct sockaddr)
sizeof(sockaddr)


作为一种编码"样式",这很可能是C的一种继承,其中关键字是必需的。

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

1
2
3
4
5
6
7
8
9
struct x
{
};

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

就我个人而言,我不认为有一个变量或与类型同名的函数的好样式,我更喜欢避免为此目的使用struct关键字,但语言允许这样做。


这个语法来自C,它是必需的。在C++中,只有一个需要使用的语法

N3367.91/2< Buff行情> < P>类声明将类名引入声明它的作用域,并隐藏任何类、变量,函数或封闭范围(3.3)中该名称的其他声明。如果在作用域中声明类名如果还声明了相同名称的变量、函数或枚举器,则当两个声明都声明时在范围内,只能使用详细的类型说明符引用类

1
2
3
4
5
6
7
8
9
10
11
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++中,Strut关键字在声明变量时几乎不相关。

超过您曾经想知道的:在C++中使用Stutt关键字在变量声明中


这样的代码直接来自C(最有可能是通过复制和粘贴),在EDCOX1的0个关键字之前,需要在任何类型的名称之前定义为结构(除非您添加适当的EDCOX1×2)语句。以这种方式使用EDCOX1的0Ω仍然在C++中支持向后兼容性,但是因为在C++中EDCOX1的4度自动地将EDCOX1×5作为一个类型名称,因此通常(通常)安全地将该类型称为EDCOX1(5)。