2

次のような 2 つの C 構造体があるとします。

struct buffer_t {
    void *buffer;
    int length;
};

struct type_t {
    int a;
    struct buffer_t buf;
    double c;
} obj;

objそして、の 2 番目のフィールドをエクスポート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シンボルを割り当てる方法はありますか?

4

4 に答える 4

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);
}
...
于 2013-08-10T14:40:34.903 に答える