为什么在C中使用标题中的extern关键字?

时间:2013-10-05 14:28:31

标签: c extern linkage

为什么我应该在以下代码中使用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

我不明白在哪种情况下会出现问题,有人可以举个例子说明它会崩溃吗?

5 个答案:

答案 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)

首先,你的代码编译很奇怪。对于kFloatFile.c变量的双重定义,它应该抛出编译时错误。

其次,如果您尝试在两个文件中使用公共变量,则不应在header.h中定义它。您应该在头文件中使用extern关键字,以便包含header.h的文件知道它已在外部定义。

现在,您可以在任何c文件中全局定义变量,然后将该变量用作公共变量。

答案 4 :(得分:2)

我为什么要使用extern ......?

嗯,你不应该。干净利落。因为您不应该使用全局变量,并且它们是唯一需要extern关键字的变量。

每当您想要使用全局变量时,请再想一想。在绝对最大值时,您可能需要使用带有文件范围的变量(使用static关键字),通常这样的变量会伴随一些操作/使用其值的函数,但变量本身应该超出文件范围不可见。使用全局变量只会导致难以纠结的代码,如果不引入大量的错误几乎不可能改变。