如何从C导出结构的字段

时间:2013-08-10 14:22:42

标签: c gcc struct export symbols

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

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

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

我希望导出obj的第二个字段buf,以便a可以从另一个文件引用它,例如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分配一个符号?

4 个答案:

答案 0 :(得分:2)

您无法“导出”单个结构成员字段。

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

答案 1 :(得分:2)

在C中你不能。但是,如果你真的需要让它工作......这项工作至少与我的gcc

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

+4显然是结构中成员的偏移量,如果你需要将其设置为dinamically(例如 offsetof )......你将打开另一个地狱之门,祝你好运。

答案 2 :(得分:0)

您无法“导出”某个字段。您可以将结构定义放在接口(头文件)中,允许其他人创建该类型的结构。

要访问该单个字段,您需要使用指针 - 没有其他方法。如果您没有使用指针,那么您正在改变堆栈上的值,并且一旦从调用堆栈弹出堆栈帧就没有任何反应。

答案 3 :(得分:0)

你可以这样做:

header.h

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

的module.c

...
#include "header.h"

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

struct buffer_t * pbuffer = &obj.buf;
...

anothermodule.c

...
#include "header.h"

void somefunction()
{
  /* access buffer to do something with it */

  printf("external buffer's length is: %d\n", (*pbuffer).length);
}
...