我试图声明一个依赖于另一个 struct 的 struct .

typedef struct _parent
{
  float calc ;
  char text[255] ;
  int used ;
} parent_t ;

现在我想声明一个与parent_t.text大小相同的 struct child_t.

我怎么才能做到这一点呢?(下面是伪代码.)

typedef struct _child
{
  char flag ;
  char text[sizeof(parent_t.text)] ;
  int used ;
} child_t ;

我用parent_tstruct _parenttry 了几种不同的方法,但我的编译器不会接受.

作为一个技巧,这似乎是有效的:

parent_t* dummy ;
typedef struct _child
{
  char flag ;
  char text[sizeof(dummy->text)] ;
  int used ;
} child_t ;

可以不使用dummy而申报child_t吗?

推荐答案

虽然使用#define定义缓冲区大小是一种惯用的方法,但另一种方法是使用如下所示的宏:

#define member_size(type, member) sizeof(((type *)0)->member)

这样使用:

typedef struct
{
    float calc;
    char text[255];
    int used;
} Parent;

typedef struct
{
    char flag;
    char text[member_size(Parent, text)];
    int used;
} Child;

事实上,我有点惊讶,sizeof((type *)0)->member)甚至可以作为一个常量.很酷的东西.

C++相关问答推荐

传递给空闲的无效地址0x71 db7 cb5e0:未分配值

为什么这个C程序代码会产生以下结果?

malloc实现:判断正确的分配对齐

拥有3x3二维数组并访问数组[1][3]等同于数组[2][0]?

二进制计算器与gmp

fwrite无法写入满(非常大)缓冲区

如何在c++中包装返回空*的函数

C在声明带有值的数组时,声明大小有用吗?

Setenv在c编程中的用法?

错误...的多个定义(&Q)首先在这里定义&

为什么WcrTomb只支持ASCII?

C-try 将整数和 struct 数组存储到二进制文件中

从C中的函数返回静态字符串是不是一种糟糕的做法?

为什么二进制文件的大小不会随着静态数据的大小而增加?

为什么我在我的代码中得到错误和退出代码-1073741819(0xC0000005),但如果我添加了一个不相关的打印语句,它仍然有效?

";错误:寄存器的使用无效;当使用-masm=intel;在gcc中,但在AT&;T模式

WSASocket在哪里定义?

gdb - 你能找到持有内部 glibc 锁的线程吗?

execve 不给出which命令的输出

获取 struct 中匿名 struct 的大小