c 语言全局变量的使用

发布于 2022-09-07 20:30:24 字数 977 浏览 60 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

倦话 2022-09-14 20:30:24

如果你希望全局变量能被外部访问,就在.h文件里用extern声明
如果只希望当前文件的所有函数共享这个全局变量,就在.c文件里声明

旧时浪漫 2022-09-14 20:30:24

这不光是全局变量的问题,还涉及到#include的使用效果。编译器在看到#include时,会把指定文件中的内容完整复制到本文件中。就你给出的这三个文件中的内容来讲,编译main.c时,编译器处理#include "ggg.h"后,main.c文件是这个样子:

//main.c
#include <stdio.h>
//ggg.h
#ifndef ggg_h
#define ggg_h

#include <stdio.h>

int num;//就是这个全局变量,好烦
void ggg();

#endif /* ggg_h */

int main(int argc, const char * argv[]) {
    ggg();
    return 0;
}

也就是说,int num这个变量变成了main.c文件的一个全局变量。
而处理ggg.c文件的时候,ggg.c将变成下面的样子:

// ggg.c

//ggg.h
#ifndef ggg_h
#define ggg_h

#include <stdio.h>

int num;//就是这个全局变量,好烦
void ggg();

#endif /* ggg_h */

void ggg(){
    
    num =1;
    printf("ggg::%d",num);
}

于是ggg.c中也有一个int num变量。
链接这两个文件编译出的目标文件的时候,就出现了两个int num,编译器自然会报错了。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文