其实我想知道extern
的重要性。
首先我写了一些代码:
file1.h
extern int i;
file2.c中
#include<stdio.h>
#include "file1.h"
int i=20;
int main()
{
printf("%d",i);
return 0;
}
现在我的问题是:当我必须在i
中定义file2.c
时,extern变量的用途是什么,在file1.h
中声明对我有用。< / p>
sudhanshu
答案 0 :(得分:6)
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
时才需要它。
答案 1 :(得分:3)
当您有三个文件时,这很有用:
foo.h中
extern int i;
void bar();
交流转换器:
#include "foo.h"
int i = 6;
int main(){
bar();
}
b.c:
#include "foo.h"
void bar(){
printf("%d\n", i);
}
正如您所看到的,i
和a.c
之间共享b.c
,而不是每个文件重新定义,就像没有extern
关键字一样。
答案 2 :(得分:3)
C中的“extern”声明表示存在全局变量和类型。
在C中,每个.c文件的行为都像一个单独的模块。因此,具有“extern”的变量是在当前模块外部定义的。
在一个地方定义全局,然后在所有其他地方声明对它的外部引用总是更好的做法。在引用任何共享库提供的全局变量时,这一点很重要,以确保您的代码引用变量的正确和公共实例。
答案 3 :(得分:3)
来自Wikipedia:
定义变量时,编译器会为其分配内存 变量并且可能还将其内容初始化为某个值。 声明变量时,编译器需要该变量 别处定义。声明通知编译器a 变量由该名称和类型存在,但编译器不需要 为它分配内存,因为它是在其他地方分配的。
Extern是一种明确声明变量或强制变量的方法 没有定义的声明
如果在文件1中定义了变量,则为了使用它 在另一个文件中的变量,必须声明它。不管 文件数量,此变量仅定义一次,但必须 在包含定义的文件之外的任何文件中声明。
如果程序在多个源文件中,并且定义了变量 在file1中并在file2和file3中使用,然后是extern声明 在file2和file3中需要连接变量的出现次数。
答案 4 :(得分:1)
让extern告诉编译器它是变量的声明。
在file1.h的示例中,假设如果未指定extern关键字会发生什么。它看起来像int i有两个定义。此外,头文件可以包含在许多.c文件中。如果您编译这些.c文件并链接它们,链接器将看到同一变量的多个定义。
答案 5 :(得分:1)
extern关键字允许你对编译器说...“现在使用这个变量..我将在以后定义并初始化它”..即“现在编译它......我将在以后链接到它的定义”。< / p>
当您在其他文件中定义变量并且想要在当前上下文中使用变量时,可以对该变量进行外部实现。
答案 6 :(得分:1)
标题中的声明允许您从多个源文件访问变量,同时仍然只在一个位置定义它。