C - extern 限定符的用法

C - usage of extern qualifier

我有以下三个文件。在头文件中,我声明了一个全局变量并尝试使用 extern 访问其他文件。但是我遇到了链接器错误。

Header1.h

  #ifndef HEADER1_H
  #define HEADER1_H

  #include<stdio.h>

  int g = 10;
  void test();

  #endif 

test.c

  #include "header1.h"

  extern int g;

  void test()
  {
       printf("from print function g=%d\n", g);
  }

main.c

  #include "header1.h"

  extern int g;

  int main()
  {
     printf("Hello World g=%d\n", g);
     test();
     getchar();
     return 0;
  }

链接器错误:

  LNK2005   "int g" (?g@@3HA) already defined in main.obj   
  LNK1169   one or more multiply defined symbols found  

我对extern的理解是变量只能定义一次,但可以声明多次。我想我是这样遵循的——我在头文件中定义了全局变量 g 并尝试在 .c 文件中访问它。

你能纠正我的理解吗?究竟是什么导致了这里的链接器错误?我没有多次定义g

你得到一个多重定义错误,因为你把定义放在了头文件中。因为两个源文件都包含头文件,所以导致 g 在两个地方都被定义,因此出现错误。

您想将声明放在头文件中,将定义放在一个源文件中:

在header1.h中:

extern int g;

在test.c中:

int g = 10;

main.c.

中什么也没有