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)
我只是好奇最初的原因是什么?如果没有理解,它似乎是一个糟糕的语言设计的例子,它会引起歧义并且令人困惑.
正如您在Stroustrup的引用中所述,其原因是历史性的.在C中,您必须始终在结构的名称前加上struct
; 结构的名称(如联合或枚举的名称)称为标记,并且与其他符号位于完全不同的名称空间中.所以像:
struct stat
{
// ...
};
int stat( char const* filename, struct stat* buf );
Run Code Online (Sandbox Code Playgroud)
是完全合法的.(以上是Posix的一部分).
在C++中,一个类的名称(以申报class
,struct
或
union
)或枚举是在同一个命名空间的一切,而不像在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
,随后符号),其中非类型名称在查找忽略.
归档时间: |
|
查看次数: |
296 次 |
最近记录: |