【问题标题】:How to export a struct's field from C如何从 C 中导出结构的字段
【发布时间】:2013-08-12 08:05:18
【问题描述】:

如果我有两个这样的 C 结构:

struct buffer_t {
    void *buffer;
    int length;
};

struct type_t {
    int a;
    struct buffer_t buf;
    double c;
} obj;

我想导出obj 的第二个字段buf,以便可以从另一个文件中引用它,例如extern struct buffer_t buffer(或其他),有什么方法可以实现吗?我需要导出obj.buf 结构,而不是指向它的指针。

编辑 我需要专门导出obj.buf,而不是整个obj 结构。

EDIT2 我想我最好用汇编代码来解释我需要什么。编译器应该为obj的声明生成以下汇编代码:

    .data
    .align  8
.obj:
    .long   0            # obj.a
    .zero   8            # obj.buf.buffer
    .zero   4            # obj.buf.length
    .quad   0            # double 2
    .size   obj, 32

但我想强迫它产生类似的东西:

    .globl  obj_buf

    .data
    .align  8
.obj:
    .long   0            # obj.a
obj_buf:
    .zero   8            # obj.buf.buffer
    .zero   4            # obj.buf.length
    .quad   0            # double 2
    .size   obj, 32

因此obj.buf 由符号标识。那么,有什么方法可以让 C 编译器(GCC 或 Clang)为 obj.buf 分配一个符号?

【问题讨论】:

  • 您可以将结构定义放在您的界面中——让其他人创建相同的结构?我认为您不了解结构是什么。
  • @JacobPollack 是的,结构定义是公开的,因此任何人都可以创建type_tbuffer_t 结构。在我的程序中,我有几十个type_t 结构,但obj 一个很特殊,我需要导出它的buf 字段。
  • @JacobPollack 顺便说一下,那些type_t 结构当然是全球性的。
  • 为什么不能使用指向缓冲区的指针并在使用时取消引用它?
  • @alk 好吧,导出指向obj.buf 的指针是最简单的方法。但是,不幸的是,obj.buf 是作为struct buffer_t 变量从另一个库导入的,而不是struct buffer_t * 变量。

标签: c gcc struct export symbols


【解决方案1】:

在 C 中你不能。但是如果你真的需要让它工作......至少可以使用我的 gcc

asm (".set obj_buf, obj+4\n\t.globl obj_buf\n");

+4 显然是结构中成员的偏移量,如果您需要动态设置它(例如使用 offsetof)...您将打开另一扇地狱之门,祝您好运。

【讨论】:

    【解决方案2】:

    您不能“导出”单个结构成员字段。

    但是,您可以拥有一个返回该特定字段(或指向它的指针)的函数。

    【讨论】:

      【解决方案3】:

      你可以这样做:

      header.h

      ...
      struct buffer_t {
        void *buffer;
        int length;
      };
      extern struct buffer_t * pbuffer;
      ...
      

      模块.c

      ...
      #include "header.h"
      
      struct type_t {
        int a;
        struct buffer_t buf;
        double c;
      } obj;
      
      struct buffer_t * pbuffer = &obj.buf;
      ...
      

      另一个模块.c

      ...
      #include "header.h"
      
      void somefunction()
      {
        /* access buffer to do something with it */
      
        printf("external buffer's length is: %d\n", (*pbuffer).length);
      }
      ...
      

      【讨论】:

      • 是的,这将是做我需要的最简单和最常见的方法,但我需要符合另一个预先存在的库,它直接引用 buf 作为 struct buffer_t 变量,而不是一个指针而不是函数。
      • @LuisAntonioBotelhoO.Leite:好的,那你需要换另一边。即struct type_t 通过指针访问buffer_t 类型的全局外部变量。
      【解决方案4】:

      您不能“导出”字段。您可以将结构定义放在您的界面(头文件)中,允许其他人创建该类型的结构。

      要访问那个单独的字段,您需要使用指针——没有其他方法可以解决这个问题。如果你不使用指针,那么你正在改变堆栈上的值,一旦堆栈帧从调用堆栈中弹出,什么都不会发生。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-28
        • 1970-01-01
        • 2016-11-17
        • 1970-01-01
        • 2017-05-04
        • 2021-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多