0

在一个文件中,我有一个结构,例如...

struct t {
    int private;
    int public;
};

struct t s;

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

struct t {
    int private;
    int public;
};

extern struct t s;

...进入头文件,并让其他文件引用s.public.

我想避免这种情况,因为它锁定了spublic​​用s.public. 这意味着public如果我在需要重新编译private2之后添加了新文件,这些文件的地址就会错误。private

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

extern int s_public_direct;

...并且不知道public碰巧居住的结构的布局(甚至存在)。

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

请注意,这不是范围问题,因此private使用 C++进行标记private:不会改变引用对象文件仍将传递封闭结构的基地址,然后将偏移量添加到public. 我真的在寻找某种 C/C++ 语法,它告诉编译器导出结构内部变量的符号。或者可能是一种声明新的可导出符号的方法,例如int s_public_direct作为结构内变量的别名。

4

1 回答 1

4

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

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

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

于 2018-10-31T21:51:02.760 回答