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

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

任何人都可以提供标准的参考,以确定范围规则在这种情况下的确切工作方式吗? 以及允许内部结构在包含结构外可见的任何理由? 如果它是可见的,为什么不在外面声明结构…

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

struct out{ int a, b; char c, d; struct in{ int a, b; }e; }; 

我是否为struct outstruct in提供了定义 ; 或者我是否为两者提供声明 ? 我理解函数和原始数据类型的区别,但对于struct来说并不是很清楚。

编辑 :我在SO上找到的有用链接: C和C ++中的嵌套结构 。

但它没有提供任何理由。 现在我怀疑是否有一个C …

对于C99标准草案 ,范围规则在6.2.1 标识符范围和第7段中说明( 强调我的 ):

结构,联合和枚举标记具有在声明标记的类型说明符中标记出现之后开始的范围 。 每个枚举常量都具有在枚举器列表中定义枚举器出现之后开始的范围。 任何其他标识符的范围都在其声明者完成之后开始。

范围以第4段规定的规则结束:

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

至于理由,它可能与以下事实有关:与C ++不同,在C中我们没有范围解析运算符( ::

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

 struct out ; 

另请参阅: 定义和声明之间有什么区别? 。

有关C和C ++之间所有不兼容性的列表,您可以在 此处查看ISO C和ISO C ++之间的不兼容性 。

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

在C ++中,封装(隐藏)非常相关,它认为内部结构定义了一个内部到out的类型(在其命名空间中),除非特别用于::否则不要在外部使用。 C ++中的类和结构几乎是一样的,所以它是struct而不是class ,在这里是偶然的。

C和C ++不同的有趣方式之一。