我正在尝试一个代码,它有两个C ++文件(client.cpp
和server.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
。
答案 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;
但未申报;