在一个文件中,我有一个结构,比如。。。
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(,或其他各种有用的东西(对值强制执行一些约束,或缓存依赖于它们的东西,并在值更改和需要重新计算时使缓存无效。(