【问题标题】:Scope of structure declared/defined within another structure在另一个结构中声明/定义的结构范围
【发布时间】:2014-04-17 07:45:06
【问题描述】:

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

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

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

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

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

编辑:我刚刚在 SO:Nested structures in C and C++ 上找到的有用链接。

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

【问题讨论】:

  • +1 用于进行研究并尝试更深入地挖掘语言。

标签: c struct scope


【解决方案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

【讨论】:

  • 我将看一下标准中的相应部分。但是引用标识符的范围结束会更有用。我认为内部结构的范围在包含结构之后结束。另外,你能快速看一下我在 OP 中嵌入的关于术语的问题 2 吗?
  • 谢谢!你能看看我关于结构的另一个问题here 并提供一些意见吗?
  • @Rich 这是一个更复杂的问题,需要更多的思考,实际上 C++ 中的规则要困难得多。我并没有真正的脑力充沛,但我会尽可能地尝试看看它,但不确定什么时候会。我确信 Ben 是正确的,但有时你如何解释某事会产生很大的不同。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 2016-10-11
    • 1970-01-01
    • 2014-11-30
    • 2016-07-14
    • 1970-01-01
    • 2013-12-23
    • 2012-04-24
    • 1970-01-01
    • 2015-05-24
    相关资源
    最近更新 更多