可能的重复项:
什么是外联和内联C++
其实我想知道extern
的重要性。
首先我写了一些代码:
文件1.h
extern int i;
文件2.c
#include<stdio.h>
#include "file1.h"
int i=20;
int main()
{
printf("%d",i);
return 0;
}
现在我的问题是:当我必须在file2.c
中定义i
时,extern变量有什么用,在file1.h
中声明对我有用。
苏丹书
extern
允许您声明一个变量(通知编译器它的存在),而无需定义它(使其存在)。一般规则是,您可以根据需要多次声明事物,但只能定义一次。
例如,如果要在其他地方定义它,这将很有用。
考虑:
file1.c: file2.c:
extern int xyzzy; int xyzzy;
void fn (void) {
xyzzy = 42;
}
当你将这两个函数链接在一起时,将有一个xyzzy
,即file2.c
中定义的那个,这就是fn
将要改变的那个。
现在即使没有extern
也会发生这种情况.extern
所做的是声明xyzzy
存在以file1.c
,这样您就不会收到任何I don't know what the blazes "xyzzy" is
错误。
在您的特定情况下(如果这是您唯一的两个文件),则不需要它。仅当您有另一个#include
d file1.h
并尝试访问i
的文件时才需要它。
当您有三个文件时,它很有用:
福.H
extern int i;
void bar();
交流:
#include "foo.h"
int i = 6;
int main(){
bar();
}
公元前:
#include "foo.h"
void bar(){
printf("%dn", i);
}
如您所见,i
在a.c
和b.c
之间共享,而不是像没有extern
关键字时那样按文件重新定义。
C 中的 "extern" 声明表示全局变量的存在及其类型。
在C语言中,大多数.c文件的行为就像一个单独的模块。因此,带有"extern"的变量是在当前模块外部定义的东西。
在一个地方定义全局,然后在所有其他地方声明对它的外部引用总是更好的做法。当引用任何共享库提供的全局变量时,这对于确保您的代码引用变量的正确且通用的实例非常重要。
来自维基百科:
定义变量时,编译器会为其分配内存 变量,也可能将其内容初始化为某个值。 声明变量时,编译器要求该变量 在别处定义。该声明通知编译器 存在具有该名称和类型的变量,但编译器不需要 为它分配内存,因为它是在其他地方分配的。
Extern 是一种显式声明变量或强制 没有定义的声明
如果在文件 1 中定义了变量,以便使用相同的变量 变量,则必须声明它。无论 文件数,此变量仅定义一次,但是,它必须 在包含定义的文件之外的任何文件中声明。
如果程序位于多个源文件中,并且定义了变量 在文件 1 中并在文件 2 和文件3 中使用,则外部声明是 在 File2 和 File3 中需要连接变量的出现次数。
extern告诉编译器它是一个变量的声明。
在 file1.h 的示例中,想象一下如果您不指定 extern 关键字会发生什么。看起来int i有两个定义。此外,头文件可以包含在许多 .c 文件中。如果编译这些 .c 文件并链接它们,链接器将看到同一变量的多个定义。
extern 关键字允许您对编译器说..." 立即使用此变量。我稍后将定义并初始化它"..即" 立即编译.我稍后将链接到其定义"。
当您在其他文件中定义变量并希望在当前上下文中使用它时,您可以 extern
中的声明允许您从多个源文件访问变量,同时仍然只在一个位置定义它。