我在C
中读到了全局变量。我对extern
关键字有两个问题。
extern
关键字全局声明的变量需要初始化?extern
关键字的情况下全局声明的变量不需要初始化?请解释其中的差异。
答案 0 :(得分:2)
为什么要使用extern
?
// declarations
extern int foo1;
extern int foo2;
初始化不需要。缺少显式初始化的全局变量初始化如下。
声明变量不会定义它。在某些单元中,变量(如果使用)需要定义。
为什么在没有extern
的情况下全局声明的变量不需要初始化?
// declaration and definition - no initialization
int foo3; // Same functional effect as int foo3 = 0;
// declaration and definition - with initialization
int foo4 = 5;
缺少显式初始化的全局变量初始化如下。
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变量。