【问题标题】:Declaring vs defining variables in c [duplicate]在c中声明与定义变量[重复]
【发布时间】:2015-06-30 01:53:40
【问题描述】:

据我所知,这是一个声明:

int i;

这是一个定义:

int i = 10;

也许我错了,我不争辩。

问题是编译器是否为已声明(但未定义)的变量留出内存?

【问题讨论】:

  • 有点相关,当你定义一个尚未声明的符号时,你既声明又定义符号。
  • C有tentative definition的概念。
  • 这两行都是声明。两者都可以是定义(通常是)。

标签: c variables definition variable-declaration


【解决方案1】:

定义是为变量分配存储空间。声明并不意味着存储空间已经分配。

声明用于访问在不同源文件或库中定义的函数或变量。定义类型和声明类型不匹配会产生编译器错误。

下面是一些在 C 中不是定义的声明示例:

extern char example1;
extern int example2;
void example3(void);

来自C standard (n1256)

6.7 声明
...
5 声明规定了一组标识符的解释和属性。

标识符的定义是该标识符的声明:
— 对于一个对象,导致为该对象保留存储空间;
— 对于函数,包括函数体;101)
— 对于枚举常量或 typedef 名称,是(唯一的)声明 标识符。

【讨论】:

  • 这当然意味着问题中的两行代码都可以是定义。
【解决方案2】:

“编译器是否为已声明(但未定义)的变量留出内存?”

没有。编译器只为(在)变量定义时分配内存,而不是在变量声明时。

通过一个简单的类比可以更好地理解逻辑,单个变量允许多次声明,但不允许多次定义。

【讨论】:

    【解决方案3】:

    编译器是否为声明的(但未定义的)预留内存 变量?

    不,编译器只记下这个变量名和类型。没有为声明分配内存。

    如果使用i(未优化)并且i 中的no other definition 存在于任何其他编译单元中,则int i; 可以表现为定义,并且将为它保留存储空间。 (因为存储空间是为定义保留的)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      相关资源
      最近更新 更多