如何从 C 中导出结构的字段

Posted

技术标签:

【中文标题】如何从 C 中导出结构的字段【英文标题】:How to export a struct's field from 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 * 变量。 【参考方案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】:

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

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

【讨论】:

以上是关于如何从 C 中导出结构的字段的主要内容,如果未能解决你的问题,请参考以下文章

如何从 GAE 数据存储中导出 BLOB 类型字段?

从在verilog中定义为结构网表的电路中导出部分电路

如何从非托管 C++ 代码获取结构化列表值到 C#?

Oracle数据库,不同的数据库,如何把表结构相同的数据从一个数据库中导入至另一个数据库?

如何将结构字段与C中的变量进行比较? [复制]

如何在 Blender 导出脚本中导出每个顶点的 UV 坐标