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

Man*_*cob 6 c language-lawyer c11

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

标识符的定义是该标识符的声明:
- 对于对象,导致为该对象保留存储;
[...]

我没有找到一个完整的列表,其中列出了哪些对象声明会导致保留存储空间.直观地说,我很清楚,但是我无法从C11标准中获得这些信息.

小智 6

没有明确的清单,因为标准只描述了什么是定义,而不是在一个地方.我会试着在这里总结一下.我只会int在没有任何限定符(例如const)的情况下使用此类型来保持一致性.

  • 如果为声明添加初始化程序,它始终是一个定义:

    int x = 1;
    
    Run Code Online (Sandbox Code Playgroud)
  • 如果没有初始化程序,以下是它们在函数范围内的定义:

    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
    
    Run Code Online (Sandbox Code Playgroud)
  • 文件范围内,规则有点复杂; 以下是暂定的定义:

    int x;
    static int x;
    
    Run Code Online (Sandbox Code Playgroud)

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

    具有不带初始化程序的文件范围且没有存储类说明符或存储类说明符的对象的标识符声明static构成 暂定定义.如果翻译单元包含一个或多个标识符的暂定定义,并且翻译单元不包含该标识符的外部定义,那么行为就像翻译单元包含该标识符的文件范围声明一样,复合类型为翻译单元的结尾,初始化程序等于0

    所以这意味着如果没有发现他们引用另一个定义,他们最终会" 成为定义 ".

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

    extern int x;     // <- not a definition
    
    Run Code Online (Sandbox Code Playgroud)

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