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)

阅读 3.5k
2 个回答

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

这不光是全局变量的问题,还涉及到#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,编译器自然会报错了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题