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 ++编译.
包含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中定义它是完全合理的.
希望有帮助:)