为什么可以声明一个具有相同名称的结构和非结构?

Ole*_*siy 6 c c++ struct declaration

显然,

出于进入C的史前史的原因,可以在同一范围内声明具有相同名称的结构和非结构.- (Bjarne Stroustrup - C++编程语言.第4版)

例如:

struct Ambig {};

// the struct must be referred to with the prefix struct
void Ambig(struct Ambig* buf) {}
Run Code Online (Sandbox Code Playgroud)

我只是好奇最初的原因是什么?如果没有理解,它似乎是一个糟糕的语言设计的例子,它会引起歧义并且令人困惑.

Jam*_*nze 6

正如您在Stroustrup的引用中所述,其原因是历史性的.在C中,您必须始终在结构的名称前加上struct; 结构的名称(如联合或枚举的名称)称为标记,并且与其他符号位于完全不同的名称空间中.所以像:

struct stat
{
    //  ...
};
int stat( char const* filename, struct stat* buf );
Run Code Online (Sandbox Code Playgroud)

是完全合法的.(以上是Posix的一部分).

在C++中,一个类的名称(以申报class,structunion)或枚举是在同一个命名空间的一切,而不像在C,你可以写的东西,如:

struct MyClass {};
MyClass variableName;
Run Code Online (Sandbox Code Playgroud)

这不合法C.在C中,第二行必须是:

struct MyClass variableName;
Run Code Online (Sandbox Code Playgroud)

问题是C++需要能够使用C中定义的接口(如上面的Posix接口).所以C++定义了一些允许它的特殊规则:你可以给一个变量或一个函数和一个类名相同的类.当你这样做时,变量或函数名的优先级,并隐藏的类名,除了在"详尽的类型说明符"(即class, struct,union或者enum,随后符号),其中非类型名称在查找忽略.