2012-11-25 92 views
2

标识符的由式(6.2.3/1)C99标准命名空间用C

- 结构,联合的标签,和枚举(由下面的关键字结构,联合或枚举的任何*消歧);

*注:尽管有三种可能,但标签只有一个名称空间。

现在,我知道,在C++中,我们使用的命名空间,以避免诸如实体的冲突:

namespace foo { 
    struct bar // ..define bar.. 
}; 

namespace foo2 { 
    struct bar // ..define bar.. 
}; 

在C中,如何结构,联合,枚举作为一个命名空间的,什么是脚注意味着只有一个名字空间而不是三个?

回答

3

没有为标签的结构,联合和枚举一个单独的命名空间,所以你可以有

struct foo { 
    int bar; 
}; 
double foo; 

因为标签的命名是从标识的名称空间是分开的。只有一个标签命名空间意味着您不能有

struct foo { 
    int bar; 
}; 
union foo { 
    double baz; 
    long quux; 
} 

在相同的范围内。

+0

标识符名称空间中是否包含单独的标记名称空间表示它们未在一个名称空间中声明,例如全局命名空间? 'struct foo'如何与'double foo'真的分开?我记得在C++中,它被称为名称隐藏。 – user963241

+1

C中的命名空间与C++中的命名空间不同。如果你知道Haskell,那更类似的,你有类型和值的单独命名空间,所以你可以同时拥有一个'Foo'类型和一个值构造函数'Foo',就像在C中一样,你可以有一个'struct'标签'foo'和一个名为'foo'的变量。在这两种情况下,名称空间都是全局的,因为您只能拥有一个具有给定名称的实体(但您可以在不同范围内具有相同名称的实体)。 –