簡體   English   中英

如何從C導出結構的字段

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM