从Nested structures读取,我意识到在另一个结构中声明的结构的范围与包含结构相同。我认为它只是在包含结构范围内。我从这个link得到了这个印象。它说有4个名称空间,其中一个是结构的成员。我在逻辑上"推断内部结构仅限于外部结构。
在这种情况下,任何人都可以提供有关范围规则的确切工作方式的标准参考吗?以及允许内部结构在包含结构外可见的任何理由?如果它是可见的,为什么不在外面声明结构...
问题2 :对于术语,当我提供结构成员时,请说
struct out{
int a, b;
char c, d;
struct in{
int a, b;
}e;
};
我是否为struct out
和struct in
提供定义;或者我是否为两者提供声明?我理解函数和原始数据类型的区别,但对于 struct 来说并不是很清楚。
编辑:我在SO上找到的有用链接:Nested structures in C and C++。
但它没有提供任何理由。现在我怀疑是否有一个C ...
答案 0 :(得分:1)
对于C99 draft standard,范围规则包含在6.2.1
标识符范围和 7 段中(强调我的):
结构,联合和枚举标记的范围在声明标记的类型说明符中标记出现之后开始。每个枚举常量都具有在枚举器列表中定义枚举器出现之后开始的范围。任何其他标识符的范围都在其声明者完成之后开始。
范围以 4 段落中规定的规则结束:
每个其他标识符的范围由其声明的位置决定(在 声明者或类型说明符)。如果声明标识符的声明符或类型说明符出现在任何块或参数列表之外,则标识符具有文件范围,该范围终止于转换单元的末尾。如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表中,则标识符具有块作用域,该作用域终止于关联块的末尾。 [...]
至于理由,它可能与以下事实有关:与C ++不同,在C中我们没有范围解析运算符(::
)。
对于问题2
,您在示例中提供了定义和声明,这只是一个声明的示例:
struct out ;
另见:What is the difference between a definition and a declaration?。
有关C和C ++之间所有不兼容性的列表,您可以查看Incompatibilities Between ISO C and ISO C++它涵盖此主题here。
答案 1 :(得分:0)
在C中,没有任何"隐藏实现细节,"您碰巧在外部结构内部以文本方式定义结构标记是偶然的。 (没有名称空间,没有::
)
在C ++中,封装(隐藏)非常相关,它考虑内部结构定义out
内部的类型(在其命名空间中),除非专门用::
调用,否则不要在外部使用。 C ++中的类和结构几乎是一样的,所以struct
而不是class
是偶然的。
C和C ++不同的有趣方式之一。