Я пытаюсь объявить структуру, которая зависит от другой структуры. Хочу использовать из sizeof
соображений безопасности / педантизма.
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
Теперь я хочу объявить структуру child_t
того же размера, что и 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
?
sizeof
не оценивается, поэтому нет проблемы с разыменованием нулевого указателя (потому что он фактически не разыменован).Я сейчас не на своей машине для разработки, но думаю, вы можете сделать одно из следующих действий:
Изменить : мне нравится макрос member_size, который Джои предложил использовать эту технику, я думаю, что использовал бы это.
источник
Вы можете свободно использовать
FIELD_SIZEOF(t, f)
ядро Linux. Это просто определяется следующим образом:Этот тип макроса упоминается в других ответах. Но более переносимо использовать уже определенный макрос.
источник
Используйте директиву препроцессора, например #define:
источник
drand48_data
(определена в stdlib.h), и вам нужен sizeof__x
. вы не можете#define X_LEN 3
и изменить stdlib.h, использованиеmember_size
лучше, когда у вас нет доступа к источнику родительской структуры, что кажется разумной ситуацией.Вы можете использовать директиву препроцессора для размера как:
и используйте его как в родительском, так и в дочернем.
источник
/usr/include/bits/dirent.h
размерd_name
поля (structdirect
/dirent
) больше не определяется какDIRSIZ
жестко заданный; так ,sizeof()
кажется, единственный чистый способ сохранить зависимостьstruct.h
они уже определены,чтобы ты мог,
но, глядя в заголовок, кажется, что это BSD, а не стандарт ANSI или POSIX. Я попробовал это на машине Linux, и это не сработало; ограниченная полезность.
источник
Другая возможность - определить тип. Я думаю, что тот факт, что вы хотите обеспечить одинаковый размер для двух полей, является индикатором того, что у вас одинаковая семантика для них.
а затем есть поле
в обоих ваших типах.
источник
решение c ++:
sizeof (Type :: member), похоже, тоже работает:
источник
@ joey-adams, спасибо! Я искал то же самое, но для массива без символов, и он отлично работает даже таким образом:
Как и ожидалось, он возвращает 20.
И, @ brandon-horsley, это тоже неплохо работает:
источник