如何在两个C ++文件中共享变量

时间:2016-04-09 17:15:03

标签: c++

我正在尝试一个代码,它有两个C ++文件(client.cppserver.cpp)和一个common.h头文件,它包含一个类和函数。 如果客户端停止执行服务器也应该停止。为此,我想到了一个全局变量:How do I use extern to share variables between source files? 但它对我来说没有用。

错误:当我尝试g++ server.cpp common.h -o server时:

/tmp/ccjoNSQd.o: In function `main':
server.cpp:(.text+0x3a): undefined reference to `ch'
collect2: error: ld returned 1 exit status

client.cpp:

#include "common.h"

int ch=1;
int main()
{

  random r;
  do{
    cout<<"Do you want to continue: 1=yes 0=no "<<endl;
    cin>>ch;
    r.display();
    }while(ch==1);
}

服务器代码:

#include "common.h"

int main()
{
    random r;
  do{
    cout<<"display in server"<<endl;
    r.display();
    }while(ch==1);
}

COMMON.H:

#ifndef COMMON_H
#define COMMON_H
#include <iostream>
using namespace std;
extern int ch;
class random
{
    public:
        void display()
        {
          cout<<"HELLO_WORLD"<<endl;
        } 
 }; 


#endif

我想在两个文件中包含common.h。所以根据How do I use extern to share variables between source files?我在extern int ch中写了common.h,并在两个源文件中使用了ch

3 个答案:

答案 0 :(得分:2)

您想要的只会在单一编辑中起作用。要在翻译单元之间共享变量,您必须在任何函数之外将int ch=1;移动到全局作用域。然后,如果您声明extern int ch;

,则可以从其他翻译单元引用它

要在两个不同的应用程序之间共享一些数据,您必须使用一些进程间通信机制。最简单的是一些外部文件。这是一个广泛的主题,您可以在SO上找到许多答案:Sharing same variable between more than one independent programs in Linux

对于独立于平台的解决方案,我建议使用boost :: interprocess library:http://www.boost.org/doc/libs/1_60_0/doc/html/interprocess/sharedmemorybetweenprocesses.html

答案 1 :(得分:1)

这不会像你想象的那样奏效。你正在编译如下:“g ++ server.cpp common.h -o server”。这告诉我你可能也在编译客户端(或类似的东西):“g ++ client.cpp common.h -o client”。

这将创建两个单独的可执行文件。如果你正在将它们编译成一个程序,你可以按照其他答案的建议去做:将int ch;移动到其中一个文件的全局范围内(在任何函数之外,包括main),{{1}将在两个文件之间共享。

但是你没有这样做 - 你正在创建两个完全独立的程序。你不能在两个程序之间拥有一个共享的全局变量。您需要使用其他一些通信方法,例如套接字或TCP。如果它们在同一个系统上运行,你也可以使用一个简单的hack,例如让一个进程写入另一个进程读取的文本文件。

答案 2 :(得分:-1)

在一个且只有一个C文件写入(没有extern)在主级别(不在函数中)

int ch;

但不在main中声明,因为第一个将被隐藏,你可以设置值

ch = 1;

但未申报;