C99的6.2.3节说明了标识符的4中名字空间
- 标签名(label)
- 结构、联合和枚举的标签(tag)
- 结构、联合的成员
- 其他所有的标识符,属于同一个命名空间。包括变量名、函数、函数参数,typedef的类型名、enum的成员等等
#define宏有点特殊,宏覆盖所有命名空间,所有和宏同名的在预处理时都会被替换为宏
名字空间是为了解决相同作用域如何区分区分相同标识符
typedef struct baz {
int baz;
} baz;
上面的申明是合法的,typede
f引入了baz
这个名称作为struct baz { int baz }
的简写形式。同时也引入了结构标签baz
,struct baz
也可表示同样的意思。结构体内部也申明了一个baz
的成员。