如果我有两个这样的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
分配一个符号?
答案 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);
}
...