[英]How can I test the -> C operator using a struct that allows me to access a struct's field?
[英]How to export a struct's field from C
如果我有兩個這樣的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
分配一個符號?
您不能“導出”單個結構成員字段。
但是,您可以具有返回該特定字段(或指向該字段的指針)的函數。
在C中,您不能。 但是,如果您真的需要使其正常工作,至少可以與我的gcc一起使用
asm (".set obj_buf, obj+4\n\t.globl obj_buf\n");
+4顯然是該成員在該結構中的偏移量,如果您需要對其進行動態設置(例如,使用offsetof ),則可以打開另一個地獄之門,祝您好運。
您不能“導出”字段。 您可以將結構定義放在界面(頭文件)中,以允許其他人創建該類型的結構。
要訪問該單個字段,則需要使用指針-除此之外沒有其他方法。 如果您不使用指針,那么您正在對堆棧上的值進行突變,並且一旦從調用堆棧中彈出堆棧框架,就不會發生任何事情。
您可以這樣做:
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);
}
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.