1. Intro.
在C/C++中可以通过设置外部变量也叫全局变量的方法来实现多个源文件共用一个变量,但这种共用一个变量的方法是双向的,也就是引用这个变量的源文件,也可以再次对这个变量进行赋值。
2. Target
一个源文件为主函数,其中设置一个变量,再写两个源文件,在其中设置外部变量,引用主函数中的全局变量
3. Realization
有两种方法实现,一个利用头文件,另一个不通过头文件
(1)不用头文件
在a.cpp
中定义一个全局变量如int data;
在b.cpp
中加入extern int data;
即可。
(2)利用头文件
在a.cpp
中定义一个全局变量如int data;
在test.h
中定义extern int data;
然后在b.cpp
中包含test.h
文件即可。
注:a.cpp
中不可包含头文件test.h
。
这里使用的是第一种方法,不使用头文件,仿照第一种,第二种也差不多。
一共需要写5个文件:
- test.cpp
- a.cpp
- b.cpp
- a.h
- b.h
① test.cpp
#include<stdio.h>
#include<iostream>
#include "a.h"
#include "b.h"
using namespace std;
int data;
int main()
{
data = 5;
adddata2();
cout<<data<<endl;
adddata1();
cout<<data<<endl;
cout<<"hello world "<<endl;
return 0;
}
② a.cpp
#include "a.h"
using namespace std;
extern int data;
void adddata2()
{
data = data + 10;
}
③ b.cpp
#include "b.h"
using namespace std;
extern int data;
void adddata1()
{
data = data + 100;
}
④ a.h
#ifndef __A_H__
#define __A_H__
#include<iostream>
#include<stdio.h>
void adddata1();
#endif
⑤ b.h
#ifndef __B_H__
#define __B_H__
#include<iostream>
#include<stdio.h>
void adddata2();
#endif
关于头文件中的格式:
#ifndef __B_H__
#define __B_H__
...
#endif
是为了防止C/C++头文件被重复包含,因为在使用过程中头文件也会调用其他的头文件,在越复杂的工程中,不可避免会出现重复调用,如果不加上面这一段,就会报错,因为头文件重复调用的问题。
具体说明可以查看参考资料里面的第一个链接。
然后,写完这五个file,就可以run了,输出结果如下:
15
115
hello world
有输出就说明我们成功的让多个源文件共用一个变量
在这个过程中,可能会遇到一些编译的问题整理如下
4. Problem
在VS中编译,报错 undefined reference to `adddata2()’,说没有定义这个function
其实原因也很简单,是我们编译时,没有把需要一起编译的文件加进去。
点击VS界面左侧工具栏的三角形符号,然后点上方的齿轮图标
然后再回到目录,找到tasks.json
{
"tasks": [
{
"type": "cppbuild",
"label": "C/C++: g++ build active file",
"command": "/usr/bin/g++",
"args": [
"-g",
"${file}",
"/home/will/CPP_TEST/CallExternalPara/a.cpp",
"/home/will/CPP_TEST/CallExternalPara/b.cpp",
"-o",
"${fileDirname}/${fileBasenameNoExtension}"
],
"options": {
"cwd": "${fileDirname}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
},
"detail": "Task generated by Debugger."
}
],
"version": "2.0.0"
}
注意其中这两行
"/home/will/CPP_TEST/CallExternalPara/a.cpp",
"/home/will/CPP_TEST/CallExternalPara/b.cpp",
这两个文件的路径,就是我们需要一起编译的源文件,只有把这三个一起编译才能把未定义的function给补齐。
当然,也可以直接用g++编译,这里展示的是VS里编译的方法。
g++编译的解决办法,可以查看参考资料里面的第二个链接。
Reference
- extern——关键字:
https://www.cnblogs.com/lanhaicode/p/10633125.html - linux 链接库文件出现“undefined reference to" 问题的解决方法
https://blog.csdn.net/qq_17835733/article/details/72521019 - 【VSCODE】处理undefined reference to
https://blog.csdn.net/z851245955/article/details/110630454 - 两个.c文件访问同一个全局变量的用法
https://blog.csdn.net/m0_37433067/article/details/100988025 - 多个c文件共享同一个变量(全局变量)
http://blog.sina.com.cn/s/blog_b4ce638e0102veqy.html