我想知道是否可以使用来自另一个C ++类的全局变量创建多个c ++源文件实例,
假设我的c ++源文件看起来
source.cpp
int global_var1;
int global_var2;
extern "c" int function1(){
// do some thing with global_var1
}
extern "c" int function2(){
// do some thing with global_var2
}
现在如果我从具有多个实例的C ++类中调用它,它应该是正确的方法吗?
克服这种情况的更好方法是什么,我无法将source.cpp修改为另一个calss。
编辑:我想知道的是,当我从不同的类调用source.cpp上的函数时,我应该为每个实例获取不同的全局变量,还是全局变量只共享内存?
任何帮助将不胜感激。
答案 0 :(得分:2)
全局变量只在内存中存在一次,并且将由整个程序共享,即每个实例/函数将访问相同的内存,并且所有人都可以看到由一个实例/函数进行的修改。
我猜你已经知道应该避免使用全局变量。但是如果你不能修改source.cpp(并且必须按原样使用它),情况是:
如果是单个帖子,你就不会有问题。
在多线程的情况下,您可以在调用这两个函数时使用类中的std :: mutex来保护对function1和function2的访问。通过这种方式,您可以确保当时只有一个类的实例访问全局变量。
类似的东西:
class A {
static std::mutex myLock;
void someFunc()
{
myLock.lock();
int x = function1();
myLock.unlock();
}
}
std::mutex A::myLock;
如果您不想要真正的全局变量,但想模仿您的类的每个实例都拥有“自己的”全局变量,您可以尝试这样的事情:
class A {
int mglobal_var1;
int mglobal_var2;
static std::mutex myLock;
void someFunc()
{
myLock.lock();
global_var1 = mglobal_var1; // Set the real global to "local" value
int x = function1();
mglobal_var1 = global_var1; // Save the real global for later use
myLock.unlock();
}
}
std::mutex A::myLock;
答案 1 :(得分:1)
我想知道的是,当我从不同的类调用source.cpp上的函数时,我应该为每个实例获取不同的全局变量,还是全局变量只共享内存?
鉴于您的代码,所有类的实例只有一个全局变量。另一个类的实例与source.cpp中的全局变量无关。您可以从代码中的任意位置致电function1()
和function2()
。这不会改变只有一个global_var1
和一个global_var2
的事实。