C++工程中如何在一个文件中调用另一个文件中的变量

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++工程中如何在一个文件中调用另一个文件中的变量相关的知识,希望对你有一定的参考价值。

一个工程中包含许多的源文件与头文件,我想定义一个变量a,在源文件A.cpp中的一个函数可以为变量a赋值,然后源文件B.cpp中的一个函数使用这个变量,如何才能做到,请教各位大神!!

实现的方法和操作步骤如下:

1、首先, C++函数也存储在内存中,因此可以使用指针访问函数地址,如下图所示,然后进入下一步。

2、其次,完成上述步骤后,声明函数指针。该方法类似于函数原型。 以下是函数原型,如下图所示,然后进入下一步。

3、接着,完成上述步骤后,在程序中声明了一个函数指针,指针类型为整数,如下图所示,然后进入下一步。

4、然后,完成上述步骤后,要获取函数的地址,只需使用函数名称即可,如下图所示,然后进入下一步。

5、随后,完成上述步骤后,使用函数指针来调用函数。与普通指针类似,可以使用(* fq)间接调用所指向的函数,如下图所示,然后进入下一步。

6、最后,完成上述步骤后,在C++中,还可以使用函数指针,如函数名称,如下图所示。这样,问题就解决了。

参考技术A

当项目中只有两个文件时:test_1.cpptest_2.cpp

test_1.cpp:

static int g_nNum;//在此文件中定义一个全局,但局部可见的变量,也就是static变量
                  //static看下最下方注释

该文件只需这一句代码,不需要其他代码,当然,你也可以添加其他代码

test_2.cpp:

//包含test_1.cpp的头,由于我们需要用到该文件的全局变量
#include "test_1.cpp"

int main()

g_nNum = 15;//使用该变量,当然,你也可一在赋值后输出或拿该变量做算法运算
return 0;

注:这里涉及到static,static修辞一个局部变量时,该变量的生命周期是全局的,但可见性使局部的,且工程中该值唯一;修辞全局变量时,该变量生命周期全局的,可见性也是全局的,且工程中该值唯一;当修辞函数时,该函数全局可见;

static关键字网上有很多大神讲解过,我说的可能不是很详细,可以自己去查一下。

参考技术B 个人觉得famince的使用的方法不太好。
1. 假如你在A.CPP中有个变量的定义
int a = 0;
2. 在B.cpp中引用,需要添加
extern int a;
这样你就可以使用了。extern的作用是扩展a的作用域。追问

extern只是扩展了变量的作用域,换种说法就是省略了重新定义变量,但是变量中的值似乎不会保存吧

追答

1. 这里还不能说是省略了重新定义变量,因为定义只能又一次,再次定义的话,会爆重复定义的错误,一个全局的变量的作用域是从定义处到本文件的结尾部分,所以要在其他文件中引用,需要用extern进行扩展。
2. “变量中的值似乎不会保存吧”,没看懂,不管你用不用extern,变量都是一个,所有对他的操作,都是有效的。

追问

我那样做了,可是编译总是通不过,总是报错:error LNK2001: unresolved external symbol _***,望大神指教

追答

额,不能吧,你的变量是全局的吗?

本回答被提问者和网友采纳
参考技术C 1:在a.h中:
extern声明该变量,
2:在a.cpp中(包含a.h头文件):
初始化,以及修改变量
3:在b.cpp中包含a.h头文件,就可以使用,以此类推追问

在a.h中就写一句话:extern int a就可以吗?
然后a.cpp和b.cpp中包含了头文件后,还用再定义吗

参考技术D 在B.cpp眉头位置加入:#include "a.h",之后就可以在B.Cpp中调用

在 C++ 文件流中复制静态变量

【中文标题】在 C++ 文件流中复制静态变量【英文标题】:Copying static variable in C++ file stream 【发布时间】:2018-10-13 11:51:44 【问题描述】:

我编写了一个程序来使用 c++ 文件流删除存储在二进制文件中的类对象。在此过程中,我必须将所有对象从一个文件(example.dat)复制到另一个文件(temp.dat)。

我有一个 静态变量 作为类的一部分,我希望将它与对象一起复制到其中。 但静态变量并没有复制到 temp.dat,它在 temp.dat 中的值为 0,因为静态变量不是任何对象的一部分。

这是我使用的函数和类定义

                                                  //the problem is in this function
    cout<<"\nSno of record to delete: ";
    int del;
    cin>>del;

        fstream o;
o.open("temp.dat",ios::out|ios::in|ios::binary);

if(!f)

    cout<<"File not Found";
    exit(0);

else
f.seekp(0);
    f.read((char*)&dats, sizeof(dats));
    while(!f.eof())
    
        if(dats.sno!=del)
        
            o.write((char*)&dats, sizeof(dats));



        

        f.read((char*)&dats, sizeof(dats));

    


     

o.close();
f.close();
remove("date.dat");                       
rename("temp.dat", "date.dat");



return 0; 

类定义

class date
int d,m,y;
int k;
char dday[10];
char monthn[10];
char name[50];


public:

int sno;
int odd ();
void getdata();
int fsno();
void display();
static int ID; //static variable

请提出解决此问题的方法

【问题讨论】:

【参考方案1】:

你不应该混淆类和对象。静态数据成员不属于 对象,但属于整个类并在所有实例之间共享 所以你必须将它们与单个对象分开存储和读取。

例如,您可以将其存储在文件开头:

f.seekp(0);

f.read((char*)&date::ID, sizeof(date::ID));
if (!f)  cout<<"File format bad"; exit(0); 
o.write((char*)&date::ID, sizeof(date::ID));

// go on reading objects
f.read((char*)&dats, sizeof(dats));
// ...

【讨论】:

我了解静态成员的工作原理,这是由于您的回答中提到的原因,变量没有被复制到文件中。你能帮我分别复制静态变量的代码吗 一般来说它就像所有其他读写一样。取决于您要在文件中存储的位置。

以上是关于C++工程中如何在一个文件中调用另一个文件中的变量的主要内容,如果未能解决你的问题,请参考以下文章

Cocos Creator 中的js文件之间调用变量或类

请教如何在一个js文件中调用另外一个js文件的变量

如何在一个android工程中调用另一个android工程的代码和资源啊?

如何调用另一个python文件中的代码

在MFC中,一个类如何调用其他类的变量和函数??

qt多个工程之间调用