C extern关键字不';我似乎什么都不知道
我在a.c.文件中有以下程序:C extern关键字不';我似乎什么都不知道,c,extern,C,Extern,我在a.c.文件中有以下程序: #include<stdio.h> #include"b.c" int main(void){ extern int a; a+=2; printf("%d\n",a); return 0; } 现在我使用extern关键字声明变量a,但不定义它。 因此,我可以更改它的内容,打印它将打印3 我不明白的是,如果我删除行extern int a从a.c,程序也运行,输出仍然是3 我认为要更改b.c中
#include<stdio.h>
#include"b.c"
int main(void){
extern int a;
a+=2;
printf("%d\n",a);
return 0;
}
现在我使用extern关键字声明变量a,但不定义它。
因此,我可以更改它的内容,打印它将打印3
我不明白的是,如果我删除行extern int a代码>从a.c,程序也运行,输出仍然是3
我认为要更改b.c中的变量,必须使用extern关键字
这里发生了什么?以这个程序为例:
#包括
void main()
{
外部和内部;
printf(“%d”,y);
}
int y=10;
其输出为:
10
extern
是一种声明,而不是定义。
它没有定义变量,这意味着它没有给它任何内存。它只声明变量以便您可以使用它
在您的示例中,您不必声明a
,原因很简单,因为它已经被定义,因为#include
s基本上是将粘贴代码复制到您的程序中
如果你搬家
#包括“b.c”
在程序的底部,您需要extern
语句,因为y
尚未定义
旁注:extern
可以是一个定义,如果它有一个等号,如前所述。不过,在你的例子中,情况并非如此
包含该文件时,编译器正在编译一个文件
事实上,您正在编译:
#include<stdio.h>
int a = 1;
int main(void){
extern int a;
a+=2;
printf("%d\n",a);
return 0;
}
这个程序不太可能输出7
:当编译器编译main
例程时,它已经看到int a=1代码>在您包含的b.c
中,因此extern inta代码>不会告诉它任何新信息。因此,它什么也不做
#include<stdio.h>
int a = 5;
int main(void){
int a;
a+=2;
printf("%d\n",a);
return 0;
}
extern-int-a
表示“a
是int
的名称,而int
是在其他地方定义的。”但是,通过包含b.c
,您就包含了int a=1
,它定义了a
。因此编译器已经知道a
被定义为int
我认为要更改b.c中的变量,必须使用extern关键字
要按名称引用对象,需要提供该名称的声明。inta=1您包含的代码>是一个声明(也是一个定义)
你不需要说我将按名称引用对象,但你需要说“我不是在这里定义对象,只是告诉你某个地方定义的对象。”正确的使用方法不是将b.c
包含在a.c
中,而是:
- 在
b.c
中,使用int a=1定义a
代码>
- 在
b.h
中,使用extern inta声明a
代码>
- 在
a.c
中,使用包含“b.h”
来包含声明
- 在
a.c
中,不需要编写extern inta代码>你自己,因为当你包含b.h
时,你就得到了它
- 在
b.c
中,使用#包括“b.h”
检查声明。(当您在b.c
中包含b.h
时,编译器将在同一编译过程中同时看到声明和定义,并在出现导致声明冲突的错误时发出警告。)
您的“包含”实际上是将代码从b.c复制粘贴到a.c,在上面的代码中没有对代码的逻辑影响,当您退出extern inta时不会有任何区别代码>行,因为a
的定义已经在范围内,也就是说,由于#include
,从main
可见。但是如果你只退出extern
,这将带来不同;a
将成为main
的本地变量,与b.c
中定义的变量不同。但我为什么要将其移动到main下?@DuarteArribas:没有理由。只是为了测试一下。当然,如果您有理由,那么您需要extern
关键字。注意:如果提供了初始值设定项,extern
声明仍然是一个定义:extern int a=1代码>。
#include<stdio.h>
int a = 5;
int main(void){
int a;
a+=2;
printf("%d\n",a);
return 0;
}