Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在文件之间共享运行时变量_C++_Scope_Session Variables - Fatal编程技术网

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;
}