多个C++源文件共用一个变量 & 实现过程中的一些bug

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界面左侧工具栏的三角形符号,然后点上方的齿轮图标
VS

然后再回到目录,找到tasks.json
tasks

{
    "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

  1. extern——关键字:
    https://www.cnblogs.com/lanhaicode/p/10633125.html
  2. linux 链接库文件出现“undefined reference to" 问题的解决方法
    https://blog.csdn.net/qq_17835733/article/details/72521019
  3. 【VSCODE】处理undefined reference to
    https://blog.csdn.net/z851245955/article/details/110630454
  4. 两个.c文件访问同一个全局变量的用法
    https://blog.csdn.net/m0_37433067/article/details/100988025
  5. 多个c文件共享同一个变量(全局变量)
    http://blog.sina.com.cn/s/blog_b4ce638e0102veqy.html
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值