为什么我应该在以下代码中使用extern
关键字:
header.h
float kFloat; // some say I should write 'extern float kFloat;', but why?
file.c
#include <stdio.h>
#include "Header.h"
float kFloat = 11.0f;
的main.c
#include <stdio.h>
#include "Header.h"
int main(int argc, const char * argv[])
{
printf("The global var is %.1f\n", kFloat);
return 0;
}
此代码有效。全局变量kFloat默认为外部链接和静态生存期。
输出为:
全局变量为11.0
我不明白在哪种情况下会出现问题,有人可以举个例子说明它会崩溃吗?
答案 0 :(得分:7)
extern float kFloat;
声明kFloat
而不定义它。
但:
float kFloat;
也声明kFloat
,但是kFloat
的暂定定义。
添加extern
只会抑制暂定定义。在头文件中,您只需要声明,而不是定义。
如果暂定定义包含在多个源文件中,您将最终拥有同一对象的多个定义,这是C中未定义的行为。
答案 1 :(得分:2)
extern
表示在您要使用的项目(或外部功能块)中的某处定义变量。它没有为它分配内存,因为你告诉编译器这是在其他地方定义的。
必须在程序的一个模块中定义一次变量。如果没有定义或多个定义,则可能会在链接阶段产生错误。
定义是指创建变量或分配存储的位置;声明是指陈述变量性质但未分配存储的地方。
由于它可以在其他地方访问,因此它需要是静态的。
答案 2 :(得分:2)
始终将全局变量的定义(如float kFloat;
)放在.c文件中,然后输入声明(如extern float kFloat;
)在标题中。
否则,当多个.c文件包含相同的标头时,将出现多重定义错误。
答案 3 :(得分:2)
首先,你的代码编译很奇怪。对于kFloat
中File.c
变量的双重定义,它应该抛出编译时错误。
其次,如果您尝试在两个文件中使用公共变量,则不应在header.h
中定义它。您应该在头文件中使用extern
关键字,以便包含header.h
的文件知道它已在外部定义。
现在,您可以在任何c文件中全局定义变量,然后将该变量用作公共变量。
答案 4 :(得分:2)
我为什么要使用extern ......?
嗯,你不应该。干净利落。因为您不应该使用全局变量,并且它们是唯一需要extern
关键字的变量。
每当您想要使用全局变量时,请再想一想。在绝对最大值时,您可能需要使用带有文件范围的变量(使用static
关键字),通常这样的变量会伴随一些操作/使用其值的函数,但变量本身应该超出文件范围不可见。使用全局变量只会导致难以纠结的代码,如果不引入大量的错误几乎不可能改变。