在C中尝试全局变量和函数

Ami*_*mit 2 c globalization global-variables

我试图了解全局变量和函数如何在C中工作.我的程序编译并正常工作gcc,但不编译g++.我有以下文件:

globals.h:

int i;
void fun();
Run Code Online (Sandbox Code Playgroud)

globals.c:

#include "stdlib.h"
#include "stdio.h"

void fun()
{
  printf("global function\n");
}
Run Code Online (Sandbox Code Playgroud)

main.c中:

#include "stdlib.h"
#include "stdio.h"
#include "globals.h"

void myfun();

int main()
{

  i=1;

  myfun();

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

最后,myfun.c:

#include "stdlib.h"
#include "stdio.h"
#include "globals.h"

void myfun()
{
  fun();
}
Run Code Online (Sandbox Code Playgroud)

使用g ++编译时出现以下错误:

/tmp/ccoZxBg9.o:(.bss+0x0): multiple definition of `i'
/tmp/ccz8cPTA.o:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?我宁愿用g ++编译.

Goz*_*Goz 6

包含globals.h的每个文件都将定义"int i".

相反,把"extern int i;" 进入头文件然后把实际定义"int i = 1;" 在globals.c.

将标题保护放在globals.h周围也是明智的.

编辑:回答你的问题,因为#include的作用类似于剪切和粘贴.它将包含文件的内容粘贴到您调用的c文件中.当您从main.c和myfun.c中包含"globals.h"时,您将在两个文件中定义int i = 1.这个全局的值被放入可链接值表中.如果你有两次相同的变量名,那么链接器就无法分辨出它需要哪一个,你就会得到你看到的错误.而是通过在头文件的前面添加extern,您告诉每个文件"int i"在其他地方定义.显然,你需要在其他地方定义它(并且只在一个地方),所以在globals.c中定义它是完全合理的.

希望有帮助:)