C++ 在文件之间共享运行时变量
我有一个项目,其中有几个文件都包含标题C++ 在文件之间共享运行时变量,c++,scope,session-variables,C++,Scope,Session Variables,我有一个项目,其中有几个文件都包含标题global.hpp。这些文件希望在运行时共享和更新与整个程序相关的信息(在程序运行期间逐步收集数据,但在编译时已知数据字段)。现在我的想法是使用如下结构: global.hpp 现在,包含global.hpp的每个文件都可以读取和写入会话结构的字段,并轻松共享信息 这是正确的方法吗 注意:对于此特定项目,不使用线程。但是,请(对于未来的项目和其他阅读者)在回答中澄清这个(或您建议的)解决方案在线程化时是如何工作的。此外,对于本例/项目会话变量是共享的。但这
global.hpp
。这些文件希望在运行时共享和更新与整个程序相关的信息(在程序运行期间逐步收集数据,但在编译时已知数据字段)。现在我的想法是使用如下结构:
global.hpp
现在,包含global.hpp
的每个文件都可以读取和写入会话
结构的字段,并轻松共享信息
这是正确的方法吗
注意:对于此特定项目,不使用线程。但是,请(对于未来的项目和其他阅读者)在回答中澄清这个(或您建议的)解决方案在线程化时是如何工作的。此外,对于本例/项目会话变量是共享的。但这也适用于任何其他形式的共享变量。这是一个可能的解决方案,但不是一个非常干净的解决方案。在
main
中创建一个session_结构
,并将其作为参数(通过引用)传递,或者在需要访问会话数据的所有类中存储引用/副本/共享指针,这要干净得多
当多线程发挥作用时,您必须在共享数据周围放置一个互斥锁,以防止出现争用情况,即多个线程同时访问信息。如果将其作为参数传递,则该问题仍然存在,但有时可以通过复制结构来避免,这样每个线程都有一个可以更新的副本。然后在所有线程完成后合并结构。(可能会将其重构为可修改和不变的部分,以防止复制。)
顺便说一句,不需要编写
struct session\u struct
。只需使用struct Session
定义它,并将其用作Session
全局变量的使用可能会在项目变大时产生意想不到的副作用
您应该在main中创建session_struct对象,并在任何地方使用它。我有无数函数和事件处理程序,在这些函数和事件处理程序中传递它会非常烦人,并且容易出现错误。@nightcracker:然后在每个需要它的类中放置一个引用。不是类方法,而是普通的旧函数(我对C/C++是新的,所以你现在可能会哭了):具体来说,我为每个指定的事件都有一个事件处理函数数组。然后我
recv()
从包含事件ID的服务器中提取一个字节。最后,主循环调用event\u处理程序[event\u ID]()
。
#include <string>
#ifndef _GLOBAL_SESSION_STRUCT
#define _GLOBAL_SESSION_STRUCT
struct session_struct {
std::string username;
std::string password;
std::string hostname;
unsigned short port;
// more data fields as needed
};
#endif
extern struct session_struct session;
#include "global.hpp"
struct session_struct session;
int main(int argc, char* argv[]) {
session.username = "user";
session.password = "secret";
session.hostname = "example.com";
session.port = 80;
// other stuff, etc
return 0;
}