【发布时间】:2017-11-29 14:58:32
【问题描述】:
假设我在 C 中定义了一个结构。如果我声明该结构的一个实例,则必须在其前面包含“结构”关键字。
// Define struct
struct Book {
char title[50];
char author[50];
char subject[100];
int book_id;
};
// Instantiate struct
int main()
{
struct Book myBook;
}
我的问题:为什么结构关键字必须在结构的任何实例化之前?似乎编译器有大量信息可以推断出 'Book' 是一个结构。
我知道你可以通过使用 typedef 来解决这个问题,但这看起来就像是编译器应该已经知道的样板代码。
【问题讨论】:
-
在 C 中,结构和联合都有自己的命名空间,不同于全局命名空间。你必须说
struct,所以它知道在结构命名空间中查找。 -
@RaymondChen:标签命名空间在结构、联合和枚举之间共享 - 例如,您不能在同一范围内同时拥有
struct foo和union foo。标签有自己的命名空间,struct和union成员也是如此。所有其他标识符(变量名、函数名、枚举常量等)都集中在“普通标识符”命名空间中。