c 语言全局变量的使用
extern 好像能解决这个问题
//main.c
#include <stdio.h>
#include "ggg.h"
int main(int argc, const char * argv[]) {
ggg();
return 0;
}
//ggg.h
#ifndef ggg_h
#define ggg_h
#include <stdio.h>
int num;//就是这个全局变量,好烦
void ggg();
#endif /* ggg_h */
// ggg.c
#include "ggg.h"
void ggg(){
num =1;
printf("ggg::%d",num);
}
//错误信息
duplicate symbol _num in:
/Users/HOHD/Library/Developer/Xcode/DerivedData/testGlobal-dorberrgmwayrsfxpllsxbyhhbud/Build/Intermediates.noindex/testGlobal.build/Debug/testGlobal.build/Objects-normal/x86_64/main.o
/Users/HOHD/Library/Developer/Xcode/DerivedData/testGlobal-dorberrgmwayrsfxpllsxbyhhbud/Build/Intermediates.noindex/testGlobal.build/Debug/testGlobal.build/Objects-normal/x86_64/ggg.o
ld: 1 duplicate symbol for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果你希望全局变量能被外部访问,就在.h文件里用extern声明
如果只希望当前文件的所有函数共享这个全局变量,就在.c文件里声明
这不光是全局变量的问题,还涉及到
#include
的使用效果。编译器在看到#include
时,会把指定文件中的内容完整复制到本文件中。就你给出的这三个文件中的内容来讲,编译main.c
时,编译器处理#include "ggg.h"
后,main.c
文件是这个样子:也就是说,
int num
这个变量变成了main.c
文件的一个全局变量。而处理
ggg.c
文件的时候,ggg.c
将变成下面的样子:于是
ggg.c
中也有一个int num
变量。链接这两个文件编译出的目标文件的时候,就出现了两个
int num
,编译器自然会报错了。