gpt4 book ai didi

c++ - 为什么可以声明同名的结构和非结构?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:14:26 27 4
gpt4 key购买 nike

显然,

For reasons that reach into the prehistory of C, it is possible to declare a struct and a non-struct with the same name in the same scope. - (Bjarne Stroustrup - The C++ Programming Language. 4th Edition)

例如:

struct Ambig {};

// the struct must be referred to with the prefix struct
void Ambig(struct Ambig* buf) {}

我只是好奇最初的原因是什么?没有理解,这似乎是一个糟糕的语言设计的例子,导致歧义和困惑。

最佳答案

正如您从 Stroustrup 引述的那样,原因是历史的。在 C 中,您必须总是在结构与结构;结构的名称(如名称union 或 enums)被称为一个标签,并且存在于一个完全与其他符号不同的 namespace 。所以像这样的事情:

struct stat
{
// ...
};
int stat( char const* filename, struct stat* buf );

是完全合法的。 (以上实际上是 Posix 的一部分)。

在 C++ 中,类的名称(用 classstructunion) 或枚举与其他一切都在同一个命名空间中,与 C 不同,你可以这样写:

struct MyClass {};
MyClass variableName;

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

struct MyClass variableName;

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

关于c++ - 为什么可以声明同名的结构和非结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18249078/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com