C语言中标识符的名称空间
来自(6.2.3/1)C99标准 --结构、联合和枚举的标记(通过以下任意*关键字struct、union或enum消除歧义) *脚注:标签只有一个名称空间,尽管可能有三个C语言中标识符的名称空间,c,namespaces,c99,C,Namespaces,C99,来自(6.2.3/1)C99标准 --结构、联合和枚举的标记(通过以下任意*关键字struct、union或enum消除歧义) *脚注:标签只有一个名称空间,尽管可能有三个 现在,我知道在C++中,我们使用命名空间来避免实体冲突,例如: namespace foo { struct bar // ..define bar.. }; namespace foo2 { struct bar // ..define bar.. }; 在C语言中,struct、union、enu
现在,我知道在C++中,我们使用命名空间来避免实体冲突,例如:
namespace foo {
struct bar // ..define bar..
};
namespace foo2 {
struct bar // ..define bar..
};
在C语言中,struct、union、enum如何作为名称空间?脚注中只有一个名称空间而不是三个名称空间是什么意思?对于struct、union和enum的标记,有一个单独的名称空间,因此您可以
struct foo {
int bar;
};
double foo;
因为标记的名称空间与标识符的名称空间是分开的。标记只有一个名称空间意味着您不能
struct foo {
int bar;
};
union foo {
double baz;
long quux;
}
在同一范围内。是否将标记的命名空间与标识符的命名空间分开意味着它们不在一个命名空间(例如全局命名空间)中声明?
struct foo
是如何与double foo
真正分开的?正如我在C++中所记得的,它被称为名字隐藏。C中的命名空间与C++中的名称不一样。如果你知道Haskell,那就更相似了,你有单独的类型名称空间和值,因此你可以同时拥有一个类型Foo
和一个值构造函数Foo
,就像在C中,你可以拥有一个struct
标记的Foo
和一个名为Foo
的变量。在这两种情况下,名称空间都是全局的,即一种实体中只能有一个具有给定名称的实体(但在不同的作用域中可以有具有相同名称的相同实体)。