前言
为了的可读性和移植性,我们可能需要将一个CPP文件拆分成多个文件,这时,如果在一个.cpp文件中想调用另一个.cpp中的变量该如何操作?
具体步骤
1、新建不同的.cpp项目工程文件
这里面原始参数放在ex01中,new_widget用于调用原始参数。
2、在ex01.cpp中声明一个外部变量
注意:外部变量extern要放在最开始,一定不要放在class类中,否则会报错:storage class specified for 'XXX(变量名)'
3、在ex01.cpp中定义该变量
至此,该变量的声明和定义工作已经完毕,在其他.cpp文件中,例如new_widget.cpp中,如果想调用该变量,则引用一下extern即可。
4、在其他.cpp文件中调用原始变量
注意事项
要注意区分“声明”和“定义”之间的区别:
根据C++标准的规定,一个变量声明必须同时满足两个条件,否则就是定义:
(1)声明必须使用extern关键字;
(2)不能给变量赋初值
extern int a; //声明
int a; //定义
int a = 0; //定义
extern int a = 0; //定义
完整源代码
ex01.h
#ifndef EX01_H
#define EX01_H
#include <QWidget>
#include "new_widget.h"
extern int a;
namespace Ui {
class ex01;
}
class ex01 : public QWidget
{
Q_OBJECT
public:
explicit ex01(QWidget *parent = 0);
~ex01();
private:
Ui::ex01 *ui;
private slots:
void Slot_open_widget();
};
#endif // EX01_H
new_widget.h
#ifndef NEW_WIDGET_H
#define NEW_WIDGET_H
#include <QWidget>
namespace Ui {
class new_widget;
}
class new_widget : public QWidget
{
Q_OBJECT
public:
explicit new_widget(QWidget *parent = 0);
~new_widget();
private:
Ui::new_widget *ui;
};
#endif // NEW_WIDGET_H
ex01.cpp
这里我做了一个新窗口的弹出widget->show();
,不然的话显示不了qDebug()
的内容
#include "ex01.h"
#include "ui_ex01.h"
int a = 15;
ex01::ex01(QWidget *parent) :
QWidget(parent),
ui(new Ui::ex01)
{
ui->setupUi(this);
connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(Slot_open_widget()));
}
void ex01::Slot_open_widget()
{
new_widget *widget = new new_widget();
widget->show();
}
ex01::~ex01()
{
delete ui;
}
new_widget.cpp
#include "new_widget.h"
#include "ui_new_widget.h"
#include <QDebug>
new_widget::new_widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::new_widget)
{
ui->setupUi(this);
extern int a;
qDebug() << a;
}
new_widget::~new_widget()
{
delete ui;
}
运行结果如图: