c访问不同翻译单元中的数据成员

c访问不同翻译单元中的数据成员,c,pointers,memory,shared-memory,C,Pointers,Memory,Shared Memory,我编写了一些代码,使用函数指针链接c中的模块和函数。我想知道是否可以使用这些函数指针访问另一个翻译单元中的状态 我写这个结构是为了处理生命周期函数,这样我就可以让一个模块做所有的事情,你用你的函数传入一个指向这个结构的指针,当它们被调用的时候 typedef struct { void (*init_func_ptr)(void); void (*fixed_update_func_ptr)(void); void (*variable_update_func_ptr)(

我编写了一些代码,使用函数指针链接c中的模块和函数。我想知道是否可以使用这些函数指针访问另一个翻译单元中的状态

我写这个结构是为了处理生命周期函数,这样我就可以让一个模块做所有的事情,你用你的函数传入一个指向这个结构的指针,当它们被调用的时候

typedef struct {
    void (*init_func_ptr)(void);
    void (*fixed_update_func_ptr)(void);
    void (*variable_update_func_ptr)(double alpha);
    void (*variable_render_func_ptr)(double alpha);
    void (*pause_func_ptr)(void);
    void (*resume_func_ptr)(void);
    void (*resize_func_ptr)(int width, int height);
    void (*handle_event_func_ptr)(key_event *e);
    void (*quit_func_ptr)(void);
} lifecycle_ptrs;
我通常是这样设置的

    lifecycle_ptrs* ptrs;

    ptrs = calloc(1, sizeof(lifecycle_ptrs));
    ptrs->init_func_ptr = &init;
    ptrs->fixed_update_func_ptr = &fixed_update;
    ptrs->variable_update_func_ptr = &variable_update;
    ptrs->variable_render_func_ptr = &variable_render;
    ptrs->pause_func_ptr = &pause;
    ptrs->resume_func_ptr = &resume;
    ptrs->resize_func_ptr = &resize;
    ptrs->handle_event_func_ptr = &handle_events;
    ptrs->quit_func_ptr = &quit;
modulea.c
int a;
int b;
char t[] = "test";

moudleb.c
struct t;
float 12.0;
此ptrs结构在定义main的模块中设置,并作为函数参数传递。一旦通过,程序将进入无限循环,直到用户请求退出

到目前为止,这工作得很好,并做了我想做的

我现在好奇的是,有没有可能有这样的东西,我可以从另一个模块访问变量

假设模块a看起来像这样

    lifecycle_ptrs* ptrs;

    ptrs = calloc(1, sizeof(lifecycle_ptrs));
    ptrs->init_func_ptr = &init;
    ptrs->fixed_update_func_ptr = &fixed_update;
    ptrs->variable_update_func_ptr = &variable_update;
    ptrs->variable_render_func_ptr = &variable_render;
    ptrs->pause_func_ptr = &pause;
    ptrs->resume_func_ptr = &resume;
    ptrs->resize_func_ptr = &resize;
    ptrs->handle_event_func_ptr = &handle_events;
    ptrs->quit_func_ptr = &quit;
modulea.c
int a;
int b;
char t[] = "test";

moudleb.c
struct t;
float 12.0;
是否可以从模块B访问模块a的成员变量,或者从模块B访问模块a的成员变量

我可以编写函数来实现每一项功能,但我觉得可能有更优雅、更易于维护的方法来实现这一点。我还可以定义一个结构并执行一个交换函数,其中模块a可以访问模块b中的变量,反之亦然,但这对我来说似乎有点奇怪


还有其他方法吗?我更关心可维护性,但任何见解都会有所帮助,因为现在我不知所措。

是的,从技术上讲,这是可能的,只需使用
extern

但是,您没有理由这样做。如果您需要访问另一个文件中的(非常量)变量,那么这意味着您的程序设计被破坏了

如果你使用
extern
,它会变得更加脆弱,你会得到完整的紧密耦合的意大利面代码,程序中的所有东西都依赖于其他东西,所有的错误都会在程序中升级并删除与错误完全无关的东西

因此,正确的解决方案是退后一步,对整个程序设计三思而后行

使用面向对象的设计并编写每个h和c文件对,以使它们共同形成一个自治模块(称之为类、ADT或其他什么),而不是像意大利面条一样的编码,这只与它自己的指定用途有关。此类c文件中的所有文件范围变量都应声明为
静态
,以阻止外部访问。如果需要,应该通过setter/getter函数访问这些变量。可以在文件之间直接共享的唯一变量是只读常量


不过请注意,您应该尽量避免使用文件范围变量,因为它们会使代码不可重入

是的,从技术上讲这是可能的,只需使用
extern

但是,您没有理由这样做。如果您需要访问另一个文件中的(非常量)变量,那么这意味着您的程序设计被破坏了

如果你使用
extern
,它会变得更加脆弱,你会得到完整的紧密耦合的意大利面代码,程序中的所有东西都依赖于其他东西,所有的错误都会在程序中升级并删除与错误完全无关的东西

因此,正确的解决方案是退后一步,对整个程序设计三思而后行

使用面向对象的设计并编写每个h和c文件对,以使它们共同形成一个自治模块(称之为类、ADT或其他什么),而不是像意大利面条一样的编码,这只与它自己的指定用途有关。此类c文件中的所有文件范围变量都应声明为
静态
,以阻止外部访问。如果需要,应该通过setter/getter函数访问这些变量。可以在文件之间直接共享的唯一变量是只读常量


不过请注意,您应该尽量避免使用文件范围变量,因为它们会使代码不可重入

在不同模块之间共享成员的最简单方法是使用头文件

您可以向项目中添加
modulea.h
文件,如:

#ifndef modulea_H_
#define modulea_H_

extern int a;
extern int b;
extern char t[];

#endif

然后,您可以将“modulea.h”包含在
moduleb.c
源文件中。

在不同模块之间共享成员的最简单方法是使用头文件

您可以向项目中添加
modulea.h
文件,如:

#ifndef modulea_H_
#define modulea_H_

extern int a;
extern int b;
extern char t[];

#endif

然后你可以
#在你的
moduleb.c
源文件中包含“modulea.h”

可能的重复谢谢,我不认为我会走外部路线,因为我更愿意保持全局命名空间干净。我已经在每个转换单元中对变量使用了static。我想访问外部变量的主要目的是因为现在的设计有点不稳定。我也避免使用大多数OOP,这就是为什么我只使用C而不使用C++@user1610950 OOP被普遍认为是好的设计,因为它是关于程序设计的,所以它独立于所使用的编程语言。最重要的是,您应该创建没有依赖项和私有封装的自治代码模块——这是必须的。诸如继承和代码可重用性之类的其他事情可能很好,但却不那么重要。类似地,C++中没有任何东西能使代码自动获得面向对象的设计,它只是有一些方便的特性,使OOP更漂亮一些,比如构造函数/析构函数。谢谢,我不认为我会去外部路由,因为我更希望保持全局命名空间干净。我已经在每个转换单元中对变量使用了static。我想访问外部变量的主要目的是因为现在的设计有点不稳定。我也避免大多数OOP,这就是为什么