【问题标题】:Export arbitrary symbols in C导出 C 中的任意符号
【发布时间】:2019-06-10 13:58:20
【问题描述】:

假设我有翻译单元 1:

struct SomeData {
    int var1;
    int var2;
    int var3;
} some_data;

union Union1 {
    unsigned char buf[1024];
    struct {
        unsigned char _pad0[8];
        int some_int;
    };
} union1;

另外,翻译单元 2:

extern int some_int;
extern int some_data_var2;

我想让翻译单元 2 中的符号 some_int 与翻译单元 1 中的 union1.some_int 共享相同的内存。同样,我希望翻译单元 2 中的 some_data_var2 共享相同的内存在翻译单元 2 中记忆为 some_data.var2。我该怎么做?

这是在 Linux 上

【问题讨论】:

  • 没有C/C++这样的语言,做你的选择
  • 对于C,在翻译单元1中,你可以定义int *some_int = &union1.some_int;,在翻译单元2中,声明extern int *some_int;。当然,这意味着您必须使用*some_int 作为参考,而不是some_int。这可以用一个替换 some_int 的宏来隐藏,这不是一个好主意,但是首先将结构或联合成员与另一个标识符进行别名并不是一个好主意。
  • @Slava,是的,你是对的,我已经更新了问题
  • 在标准 C 和标准 C++ 中无法直接实现您想要的结果。可能有特定于平台的方法可以做到这一点,但你还没有确定你的平台,即使那样也可能是不可能的。它需要对链接器的奇特方向。如果你可以使用指针或函数,你可以接近。

标签: c linux linker clang


【解决方案1】:

您是否愿意将它们直接暴露为原始ints?

因为如果你不是,你可以添加

int& some_int() { return union1.some_int; }
int& some_data_var2() { return some_data.var2; }

到第一个翻译单元,然后在标题中声明这些函数(或者,如果必须,直接在翻译单元 2 中)。


编辑:既然你删除了C++标签之后我写了这个,只需更改对指针的引用。

【讨论】:

  • 抱歉改变你的问题
  • 没关系(尽管“C 或 C++ - 选择一个”的评论总是正确的)——答案大致相同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-03-18
  • 2016-11-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多