C中extern关键字的行为

时间:2016-09-03 06:50:18

标签: c extern

我在C中读到了全局变量。我对extern关键字有两个问题。

  1. 为什么要使用 extern关键字全局声明的变量需要初始化?
  2. 为什么在没有 extern关键字的情况下全局声明的变量不需要初始化?
  3. 请解释其中的差异。

2 个答案:

答案 0 :(得分:2)

  1. 为什么要使用extern

    全局声明的变量需要初始化
    // declarations  
    extern int foo1;
    extern int foo2;
    
  2. 初始化不需要。缺少显式初始化的全局变量初始化如下。

    声明变量不会定义它。在某些单元中,变量(如果使用)需要定义

    1. 为什么在没有extern的情况下全局声明的变量不需要初始化?

      // declaration and definition - no initialization
      int foo3;  // Same functional effect as int foo3 = 0;
      // declaration and definition - with initialization
      int foo4 = 5;
      
    2. 缺少显式初始化的全局变量初始化如下。

      C11dr 6.7.9初始化

      ...如果未明确初始化具有静态或线程存储持续时间的对象,则:

      - 如果它有指针类型,则将其初始化为空指针;
      - 如果它具有算术类型,则将其初始化为(正或无符号)零;
      - 如果是聚合,则根据这些规则初始化(递归)每个成员,并将任何填充初始化为零位;
      - 如果它是一个联合,则根据这些规则初始化(递归)第一个命名成员,并将任何填充初始化为零位;

答案 1 :(得分:-1)

  

为什么声明的变量需要初始化   全局使用extern关键字?

当我们使用 extern 关键字与未初始化的变量编译器时,思维变量已在程序中的其他位置初始化。例如:

#include <stdio.h>
extern int i;    //extern variable
int main()
{
    printf("%d",i);
    return 0;
}

<强>输出:

 undefined reference to `i'

因为,没有为这些变量分配内存。因此,在第二种情况下,编译器显示错误未知符号i。这就是为外部变量分配内存的原因,有必要初始化变量。像,

extern int i;
int i = 10;
  

为什么声明的变量不需要初始化   全局没有extern关键字?

当我们不使用 extern 关键字时,编译器会使用默认值对其进行初始化。例如:

#include <stdio.h>
int i;    //By default it is extern variable
int main()
{
    printf("%d",i);
    return 0;
}

<强>输出:

0

因为,编译器会自动初始化为默认值为extern变量