gpt4 book ai didi

c - C 中的哪些对象声明导致存储被保留(即定义)?

转载 作者:行者123 更新时间:2023-11-30 16:42:41 27 4
gpt4 key购买 nike

C11 在第 6.7 节中指定哪些声明也是定义:

A definition of an identifier is a declaration for that identifier that:
— for an object, causes storage to be reserved for that object;
[...]

我没有找到哪些对象声明导致存储被保留的完整列表。直觉上我很清楚,但我无法从 C11 标准中获取此信息。

最佳答案

没有明确的列表,因为该标准只是描述了定义,并且它不在一个地方。我将尝试在这里总结一下。为了保持一致性,我在这里仅使用 int 类型,不使用任何限定符(例如 const)。

  • 如果您向声明添加初始值设定项,它始终是一个定义:

    int x = 1;
  • 如果没有初始化程序,以下是在函数作用域中的定义:

    int x;
    auto int x; // auto is the default anyways
    register int x; // register is just a hint, but would be "storage" as well
    static int x; // also reserves storage, but with static duration
  • 文件范围中,规则有点复杂;以下是暂定定义:

    int x;
    static int x;

    标准(§6.9.2p2)的措辞是:

    A declaration of an identifier for an object that has file scope without an initializer, and without a storage-class specifier or with the storage-class specifier static, constitutes a tentative definition. If a translation unit contains one or more tentative definitions for an identifier, and the translation unit contains no external definition for that identifier, then the behavior is exactly as if the translation unit contains a file scope declaration of that identifier, with the composite type as of the end of the translation unit, with an initializer equal to 0

    所以这意味着如果没有发现它们引用另一个定义,它们最终“成为定义”。

  • 使用存储类 extern 并且没有初始化器,您没有定义:

    extern int x;     // <- not a definition

据我所知,这应该是完整的规则集。如果我忘记了什么,请随时编辑/评论。

关于c - C 中的哪些对象声明导致存储被保留(即定义)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45735575/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com