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

标签 c linker symbol-table

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

struct t {
    int private;
    int public;
};

struct t s;

让其他目标文件能够访问 s.public 的一种方法是将...

struct t {
    int private;
    int public;
};

extern struct t s;

...放入头文件中,让其他文件引用 s.public

我想避免这种情况,因为它会锁定引用 的任何目标文件中 s 的基数和 public 的基数之间的偏移量s.public.这意味着如果我在 private 之后添加新的 private2,这些文件将有错误的 public 地址,这将需要重新编译。

相反,我想找到一种方法将符号 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 作为结构内变量的别名。

最佳答案

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

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

这还允许您以只读方式导出它(通过定义没有 set 的 get)或各种其他有用的东西(对值强制执行一些约束,或缓存依赖于它们的东西并在值发生变化,需要重新计算。)

关于c - 在 C/C++ 中,是否可以导出结构内偏移量的链接器符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53092384/

相关文章:

c - 输入后下降

c - 无法理解输出的原因

compiler-construction - 符号表存储在哪里?

java - 访问 .class 文件中的符号表

compiler-construction - 如何在编译器中管理符号表

Android NDK - 未知类型名称 'wchar_t'(在 API 21 上)

c - 使用 dlopen() 加载共享库 (.so) 与将共享库包含在可执行文件中有何区别?

c - 何时一起编译文件以及何时使用库

C++:让 Boost 工作;关于包含路径和链接库的问题

objective-c - 添加一个大的静态库作为 cocoapod 或直接将所有目标文件添加到生成的二进制文件中,因为 -ObjC 链接器标志