2

如果我有两个这样的 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

4 回答 4

2

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

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

于 2013-08-10T14:25:13.797 回答
2

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

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

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

于 2013-08-10T21:01:55.183 回答
0

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

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

于 2013-08-10T14:26:48.447 回答
0

你可以这样做:

头文件.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);
}
...
于 2013-08-10T14:40:34.903 回答