Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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_Struct_Enums_Namespaces_Unions - Fatal编程技术网

为什么标准声明C中的结构、枚举和联合的标记有三个可能的名称空间,而实际上它们只有一个?

为什么标准声明C中的结构、枚举和联合的标记有三个可能的名称空间,而实际上它们只有一个?,c,struct,enums,namespaces,unions,C,Struct,Enums,Namespaces,Unions,ISO/IEC 9899:2018(C18)中规定了6.2.3“标识符的名称空间”(强调我的): 6.2.3标识符的名称空间 1如果在翻译单元的任何一点上都可以看到一个特定标识符的多个声明,那么语法上下文会消除引用不同实体的用法的歧义。因此,不同类别的标识符有单独的名称空间,如下所示: 标签名称(通过标签声明和使用的语法消除歧义) 关键字struct、union或enum的结构、联合和枚举(通过遵循any32消除歧义)的标记 机构或工会的成员;每个结构或联合的成员都有一个单独的名称空间(通过.

ISO/IEC 9899:2018(C18)中规定了6.2.3“标识符的名称空间”(强调我的):

6.2.3标识符的名称空间

1如果在翻译单元的任何一点上都可以看到一个特定标识符的多个声明,那么语法上下文会消除引用不同实体的用法的歧义。因此,不同类别的标识符有单独的名称空间,如下所示:

  • 标签名称(通过标签声明和使用的语法消除歧义)

  • 关键字struct、union或enum的结构、联合和枚举(通过遵循any32消除歧义)的标记

  • 机构或工会的成员;每个结构或联合的成员都有一个单独的名称空间(通过.or->运算符访问成员时使用的表达式类型消除歧义)

  • 所有其他标识符,称为普通标识符(在普通声明器中声明或作为枚举常量声明)


32)标签只有一个名称空间,即使可能有三个

“即使三个是可能的”是什么意思?这“可能”到底是什么意思


作为实验,我尝试编译以下代码:

#include <stdio.h>

int main()
{
    struct foo{
        int a;
        double b;
        float c;
    };

    enum foo{
        Test1,Test2,Test3
    };

    union foo{
        int x;
        double y;
        float z;
    };

    return 0;
}
#包括
int main()
{
结构foo{
INTA;
双b;
浮点数c;
};
enum foo{
测试1,测试2,测试3
};
联富{
int x;
双y;
浮动z;
};
返回0;
}
我的错误是:

错误:“foo”定义为错误的标记类型

对于这两种类型,您也可以看到
enum
union
定义,这证明在同一范围内定义的所有
struct
enum
union
标记(如所述标准)只提供了一个名称空间。但是其他两个“可能”的名称空间呢

我的问题是:

  • 为什么标准规定C中的结构、枚举和联合的标记有三个可能的名称空间,而实际上它们只有一个(在同一范围内)

为什么我们不能为结构、枚举和联合的标记使用这三种可能的名称空间,即使标准也说它们应该存在?

标准没有说为结构、联合和枚举存在单独的名称空间。它说,理论上有三种可能,这意味着该语言可以被设计为每种语言都有单独的名称空间

该语言可以设计为具有单独的名称空间,因为标记仅出现在关键字
struct
union
enum
之后,因此编译器总是知道需要哪个名称空间


尽管如此,C开发人员和C委员会还是决定在语言设计中不使用它。该标准的含义是,有一个名称空间包含结构、联合和枚举的所有标记。

所有标记名都属于一类名称空间。@VladFrommosco是的,但如果存在其他两个标记,为什么我们不能使用它们的潜力?为什么所有的反对票?标准确实是这样引用的。为什么不允许我这样问?不是我否决了你的问题。至于我,那我就可以投票了。没问题。:@Vladfrommosco我没有特别“打”你。:-)只是因为有人早一点做了。评论员在发表新评论时是否通常会自动得到“ping”警告?我没有意识到这一点。我理解“可能”,即使有三个是可能的。因为它们实际上不仅在理论上实现,而且我们不能使用它们。你有没有从委员会那里得到任何使声明更清晰的参考资料?@RobertSsupportsMonicaCellio:你说的“它们实际上得到了实施,而不仅仅是理论上的”是什么意思?他们没有得到实施。@roberts-supportsmonicacellio:你引用的这段话很清楚。介绍性发言说,“因此,各种类别的标识符都有单独的名称空间,如下所示。”接下来是一个包含四个项目的列表,每个项目用“-”标记,并用垂直间距与其他项目隔开。因此,很明显,列表中的每个项目都是该语句引入的名称空间之一。第二项是“结构、联合和枚举的标记…”,因此很明显,所有三个的标记构成一个名称空间这意味着在任何conform实现中都应该提供3个名称空间,但我们不能使用这三个单独的名称空间。@RobertSsupportsMonicaCellio:你的措辞没有意义。其他两个名称空间没有任何变化。编写编译器并不是为了实现它们。当编译器在
struct
union
enum
关键字`之后看到标记时,它会在一个数据库中查找标记,查找标记名称。仅此而已。