显然,
出于 C 史前时期的原因,可以在同一作用域中声明具有相同名称的结构体和非结构体。 -(Bjarne Stroustrup - C++ 编程语言。第四版)
例如:
struct Ambig {};
// the struct must be referred to with the prefix struct
void Ambig(struct Ambig* buf) {}
我只是好奇最初的原因是什么?如果不理解,这似乎是一个糟糕的语言设计的例子,会导致歧义和混乱。
正如您在 Stroustrup 的引述中所述,原因是
历史的。在C语言中,你must始终在名称前面加上前缀
结构与struct
;结构的名称(例如
联合体或枚举)被称为标签,并且存在于一个完全的
与其他符号不同的名称空间。所以像这样的事情:
struct stat
{
// ...
};
int stat( char const* filename, struct stat* buf );
是完全合法的。 (实际上,上面是 Posix 的一部分)。
在 C++ 中,类的名称(用class
, struct
or
union
) 或枚举与其他所有内容位于同一名称空间中,
与 C 不同的是,你可以这样写:
struct MyClass {};
MyClass variableName;
这不是合法的 C。在 C 中,第二行必须是:
struct MyClass variableName;
问题是 C++ 需要能够使用接口
在 C 中定义(如上面的 Posix 接口)。所以C++定义了
一些特殊的规则允许它:你可以给一个变量或
函数和类具有相同的名称。当您这样做时,
变量或函数名称优先,并隐藏类
名称,除了“详细类型说明符”(即class
,
struct
, union
or enum
,后跟一个符号),其中
查找时将忽略非类型名称。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)