C 在另一个结构中声明/定义的结构范围

C 在另一个结构中声明/定义的结构范围,c,struct,scope,C,Struct,Scope,从中阅读,我意识到在另一个结构中声明的结构的作用域与包含结构的作用域相同。我认为它只在包含结构中起作用。我从中得到了这个印象。它说有4个名称空间,其中一个是结构的成员。我“逻辑地”推断出内部结构的范围仅限于外部结构 是否有人可以提供标准参考,以了解范围规则在这种情况下是如何工作的?以及允许内部结构在包含结构外部可见的任何理由?如果它是可见的,为什么不在外部声明结构呢 问题2:对于术语,当我提供结构的成员时,比如 struct out{ int a, b; char c, d;

从中阅读,我意识到在另一个结构中声明的结构的作用域与包含结构的作用域相同。我认为它只在包含结构中起作用。我从中得到了这个印象。它说有4个名称空间,其中一个是结构的成员。我“逻辑地”推断出内部结构的范围仅限于外部结构

是否有人可以提供标准参考,以了解范围规则在这种情况下是如何工作的?以及允许内部结构在包含结构外部可见的任何理由?如果它是可见的,为什么不在外部声明结构呢

问题2:对于术语,当我提供结构的成员时,比如

struct out{
    int a, b;
    char c, d;
    struct in{
        int a, b;
    }e;
};
我是否为
struct out
struct in
提供了定义;还是我要为两者提供声明?我理解函数和基本数据类型之间的区别,但对于structs,这里并不是很清楚

编辑:我刚刚在SO上找到了有用的链接:

但这并没有提供任何理由。现在我怀疑是否有一个用于C的标记。

在C中,没有任何“隐藏实现细节”,即您碰巧在外部结构中以文本方式定义结构标记是偶然的。(没有名称空间,没有

<>在C++中,封装(隐藏)非常相关,它考虑内部结构定义了一个内部类型:>Out/<代码>(在其命名空间中),不被用于外部,除非特别地用<代码>::/COD>调用。C++中的类和结构几乎是相同的,因此它是<代码>结构> <代码>,而不是<代码>类< /> >,这里是偶然的。 < C和C++不同的一种有趣的方式。对于范围规则,

6.2.1标识符范围内,在第7段中(强调雷):

结构、联合和枚举标记的作用域在声明标记的类型说明符中的标记出现后立即开始。每个枚举常量的作用域都在其定义枚举数出现在枚举数列表中后立即开始。任何其他标识符的作用域都是在其声明程序完成后立即开始的

该范围根据第4款规定的规则终止:

每个其他标识符的作用域由其声明的位置决定(在 声明符或类型说明符)。如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,则该标识符具有文件作用域,该文件作用域终止于翻译单元的末尾。如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表内,则标识符具有块作用域,其终止于关联块的末尾。[……]

至于原理,可能与事实不同,在C++中,我们没有范围解析操作符(<代码>::/COD>)。 至于问题

2
,您在示例中提供了一个定义和一个声明,这只是一个声明的示例:

struct out ;
另请参见:


对于C和C++之间的所有不兼容列表,你可以查看它的主题。

+ 1,用于研究和尝试深入挖掘语言。我将看标准中的各个部分。但引用标识符的作用域何时结束更有用。我认为内部结构的作用域在包含结构之后结束。另外,你能快速看一下我在OP中嵌入的关于术语的问题2吗?谢谢!你能看一下我关于结构的其他问题,并提供一些意见吗?@富,这是一个更复杂的问题,需要更多的思考,而且C++中的规则确实更加困难。我并不是真的有足够的脑力,但我会尽我所能去研究它,但不确定什么时候会。我相信本是正确的,但有时你如何解释一些事情会产生很大的不同。