C:sizeof单个结构成员
我试图声明一个依赖于另一个结构的结构。 我想用sizeof来安全/迂腐。 
 typedef struct _parent { float calc ; char text[255] ; int used ; } parent_t ; 
 现在我想声明一个与child_t具有相同大小的struct parent_t.text 。 
我怎样才能做到这一点? (下面的伪码)
 typedef struct _child { char flag ; char text[sizeof(parent_t.text)] ; int used ; } child_t ; 
 我用parent_t和struct _parent尝试了几种不同的方法,但是我的编译器不会接受。 
作为一个窍门,这似乎工作:
 parent_t* dummy ; typedef struct _child { char flag ; char text[sizeof(dummy->text)] ; int used ; } child_t ; 
 是否有可能宣布child_t不使用dummy ? 
 尽pipe使用#define定义缓冲区大小是一种惯用的方法,但另一种方法是使用这样的macros: 
 #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)甚至允许作为常量expression式。 很酷的东西。 
我现在不在我的开发机器上,但我认为你可以做以下其中一项:
 sizeof(((parent_t *)0)->text) sizeof(((parent_t){0}).text) 
编辑 :我喜欢member_sizemacros乔伊build议使用这种技术,我想我会用这个。
使用预处理器指令,即#define:
 #define TEXT_LEN 255 typedef struct _parent { float calc ; char text[TEXT_LEN] ; int used ; } parent_t ; typedef struct _child { char flag ; char text[TEXT_LEN] ; int used ; } child_t ; 
您可以使用预处理器指令大小为:
 #define TEXT_MAX_SIZE 255 
并用于父母和孩子。
另一种可能性是定义一个types。 你想确保两个字段大小相同的事实是一个指标,你有他们相同的语义,我想。
 typedef char description[255]; 
然后有一个领域
 description text; 
在你的两个types。
  struct.h已经定义了它们, 
 #define fldsiz(name, field) \ (sizeof(((struct name *)0)->field)) 
所以你可以,
 #include <stdlib.h> /* EXIT_SUCCESS */ #include <stdio.h> /* printf */ #include <struct.h> /* fldsiz */ struct Penguin { char name[128]; struct Penguin *child[16]; }; static const int name_size = fldsiz(Penguin, name) / sizeof(char); static const int child_size = fldsiz(Penguin, child) / sizeof(struct Penguin *); int main(void) { printf("Penguin.name is %d chars and Penguin.child is %d Penguin *.\n", name_size, child_size); return EXIT_SUCCESS; } 
但是,在标题中看起来,这是一个BSD的东西,而不是ANSI或POSIX标准。 我在一台Linux机器上试了一下,并没有工作。 有限的用处。
c ++解决scheme:
sizeof(types::成员)似乎也在工作:
 struct Parent { float calc; char text[255]; int used; }; struct Child { char flag; char text[sizeof(Parent::text)]; int used; }; 
 您可以在Linux中免费使用sizeof_field(type, filed) 。 它只是定义如下: 
 #define sizeof_field(type,field) (sizeof(((type *)0)->field)) 
这是上面提到的。 但是使用已定义的macros更便于使用。
@乔伊亚当斯,谢谢! 我正在寻找同样的东西,但是对于非char数组,它甚至可以用这种方式很好地工作:
 #define member_dim(type, member) sizeof(((type*)0)->member) / \ sizeof(((type*)0)->member[0]) struct parent { int array[20]; }; struct child { int array[member_dim(struct parent, array)]; }; int main ( void ) { return member_dim(struct child, array); } 
如预期的那样返回20。
而且,@ brandon-horsley,这个作品也很好:
 #define member_dim(type, member) sizeof(((type){0}).member) / \ sizeof(((type){0}).member[0])