如何从 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_t
和buffer_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 中导出结构的字段的主要内容,如果未能解决你的问题,请参考以下文章