C extern关键字不';我似乎什么都不知道

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中

我在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中的变量,必须使用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;
    }