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

Why use the extern keyword in header in C?

本问题已经有最佳答案,请猛点这里访问。

为什么要在以下代码中使用extern关键字:

标题

1
float kFloat; // some say I should write 'extern float kFloat;', but why?

C文件

1
2
3
4
#include <stdio.h>
#include"Header.h"

float kFloat = 11.0f;

主C

1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
#include"Header.h"

int main(int argc, const char * argv[])
{
    printf("The global var is %.1f
"
, kFloat);

    return 0;
}

此代码有效。全局变量kfloat默认为外部链接和静态生存期。

输出为:

The global var is 11.0

我不明白在哪种情况下会发生问题,有人能给我举个例子,它会在哪里崩溃吗?


1
extern float kFloat;

声明kFloat而不定义它。

但是:

1
float kFloat;

同时声明了kFloat,但是kFloat的暂定定义。

添加extern只会抑制暂定定义。在头文件中,您只需要声明,而不需要定义。

如果临时定义包含在多个源文件中,那么您将最终拥有同一对象的多个定义,这在C中是未定义的行为。


我为什么要用外部的?

嗯,你不应该。简单明了。因为不应该使用全局变量,它们是唯一需要extern关键字的变量。

每当你想使用一个全局变量时,再想想。在绝对最大值时,您可能需要使用一个具有文件作用域的变量(使用static关键字),通常这样的变量会伴随一些操作/使用其值的函数,但变量本身不应在文件作用域之外可见。使用全局变量只会导致难以处理的混乱代码,如果不引入大量错误,几乎不可能更改这些代码。


首先,奇怪的是您的代码正在编译。对于File.c中的kFloat变量的双重定义,应该抛出编译时错误。

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

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


始终将全局变量的定义(如float kFloat;放在.c文件中,并将声明(如extern float kFloat;放在头中)。

否则,当多个.c文件包含相同的头文件时,将出现多个定义错误。


extern表示在您想要使用的项目(或外部功能块)中的某个地方定义了一个变量。它不为它分配内存,因为您告诉编译器这是在别处定义的。

变量必须在程序的某个模块中定义一次。如果没有定义或定义不止一个,则可能会在链接阶段产生错误。

定义是指变量被创建或分配存储的位置;声明是指变量的性质被指定但没有分配存储的位置。

因为它可以在其他地方访问,所以需要是静态的。