Estou tentando declarar uma estrutura que depende de outra estrutura. Eu quero usar sizeof
para ser seguro / pedante.
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
Agora quero declarar uma estrutura child_t
que tem o mesmo tamanho que parent_t.text
.
Como posso fazer isso? (Pseudocódigo abaixo.)
typedef struct _child
{
char flag ;
char text[sizeof(parent_t.text)] ;
int used ;
} child_t ;
Eu tentei algumas maneiras diferentes com parent_t
e struct _parent
, mas meu compilador não aceita.
Como um truque, isso parece funcionar:
parent_t* dummy ;
typedef struct _child
{
char flag ;
char text[sizeof(dummy->text)] ;
int used ;
} child_t ;
É possível declarar child_t
sem o uso de dummy
?
sizeof
não é avaliado, portanto, não há problema em desreferenciar o ponteiro nulo (porque ele não é realmente desreferenciado).Não estou na minha máquina de desenvolvimento agora, mas acho que você pode fazer o seguinte:
Edit : Eu gosto da macro member_size que Joey sugeriu usar esta técnica, acho que a usaria.
fonte
Você está livre para usar
FIELD_SIZEOF(t, f)
o kernel do Linux. É apenas definido da seguinte forma:Este tipo de macro é mencionado em outras respostas. Mas é mais portátil usar uma macro já definida.
fonte
Use uma diretiva de pré-processador, ou seja, #define:
fonte
drand48_data
(definida em stdlib.h) e você queira o sizeof__x
. você não pode#define X_LEN 3
e alterar o stdlib.h, o usomember_size
é superior quando você não tem acesso à fonte da estrutura pai, o que parece uma situação razoável.Você pode usar uma diretiva de pré-processador para o tamanho como:
e usá-lo em pais e filhos.
fonte
/usr/include/bits/dirent.h
o tamanho dod_name
campo (structdirect
/dirent
) não é mais definido como,DIRSIZ
mas embutido em código; entãosizeof()
parece ser a única maneira limpa de manter a dependênciastruct.h
já os tem definidos,então você poderia,
mas, olhando no cabeçalho, parece que isso é uma coisa BSD e não o padrão ANSI ou POSIX. Tentei em uma máquina Linux e não funcionou; utilidade limitada.
fonte
Outra possibilidade seria definir um tipo. O fato de você querer garantir o mesmo tamanho para os dois campos é um indicador de que você tem a mesma semântica para eles, eu acho.
e então tem um campo
em ambos os seus tipos.
fonte
solução c ++:
sizeof (Type :: member) parece estar funcionando também:
fonte
@joey-adams, obrigado! Eu estava pesquisando a mesma coisa, mas para array não char e funciona perfeitamente assim:
Ele retorna 20 conforme o esperado.
E, @ brandon-horsley, isso também funciona bem:
fonte