在C/C++中,是否可以为结构内部的偏移量导出链接器符号



在一个文件中,我有一个结构,比如。。。

struct t {
int private;
int public;
};
struct t s;

让其他对象文件能够访问s.public的一种方法是放置。。。

struct t {
int private;
int public;
};
extern struct t s;

转换为头文件,并使其他文件引用CCD_ 2。

我希望避免这种情况,因为它锁定了引用s.public的任何对象文件中s的基和public的基之间的偏移。这意味着,如果我在private之后添加了一个新的private2,则这些文件的public地址将错误,这将需要重新编译。

相反,我想找到一种方法,将符号s.public的位置直接导出为可能的s_public_direct,而不是导出为偏移量为`public的s。所以其他文件只需要标题。。。

extern int s_public_direct;

并且对CCD_ 12恰好居住的结构的布局(甚至存在(一无所知

有什么方法可以导出C/C++结构中变量的符号引用吗?如果没有,有没有一种优雅的方法来解决这个问题?

请注意,这不是作用域问题,因此用C++private:标记private不会改变这样一个事实,即引用对象文件仍将获得封闭结构的基地址,然后添加偏移量以获得public。我真的在寻找某种C/C++语法,它告诉编译器导出结构中的变量的符号。或者可以声明一个新的可导出符号(如int s_public_direct(作为结构中变量的别名。

最简单的方法是保持类型不透明并导出字段的访问器函数:

extern int get_t_public(struct t *);
extern void set_t_public(struct t *, int);

这允许您以只读方式导出它(通过定义不带集合的get(,或其他各种有用的东西(对值强制执行一些约束,或缓存依赖于它们的东西,并在值更改和需要重新计算时使缓存无效。(

最新更新