Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中标识符的名称空间_C_Namespaces_C99 - Fatal编程技术网

C语言中标识符的名称空间

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

来自(6.2.3/1)C99标准

--结构、联合和枚举的标记(通过以下任意*关键字struct、union或enum消除歧义)

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

现在,我知道在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
的变量。在这两种情况下,名称空间都是全局的,即一种实体中只能有一个具有给定名称的实体(但在不同的作用域中可以有具有相同名称的相同实体)。