다른 구조체에 종속 된 구조체를 선언하려고합니다. 나는 sizeof
안전 / 보행 적 으로 사용하고 싶습니다 .
typedef struct _parent
{
float calc ;
char text[255] ;
int used ;
} parent_t ;
이제 .NET 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
있습니까?
답변
a를 사용하여 버퍼 크기를 정의하는 #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)
상수 표현으로도 허용 된다는 사실이 사실 조금 놀랐습니다 . 멋진 것.
답변
나는 지금 내 개발 시스템에 있지 않지만 다음 중 하나를 수행 할 수 있다고 생각합니다.
sizeof(((parent_t *)0)->text)
sizeof(((parent_t){0}).text)
편집 : Joey 가이 기술을 사용하여 제안한 member_size 매크로가 마음에 들었습니다.
답변
FIELD_SIZEOF(t, f)
Linux 커널에서 자유롭게 사용할 수 있습니다 . 다음과 같이 정의됩니다.
#define FIELD_SIZEOF(t, f) (sizeof(((t*)0)->f))
이 유형의 매크로는 다른 답변에서 언급됩니다. 그러나 이미 정의 된 매크로를 사용하는 것이 더 이식 가능합니다.
답변
전 처리기 지시문, 즉 #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
부모와 자식 모두에서 사용합니다.
답변
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;
}
그러나 헤더를 살펴보면 이것은 ANSI 또는 POSIX 표준이 아닌 BSD 것으로 보입니다. Linux 시스템에서 시도했지만 작동하지 않았습니다. 제한된 유용성.
답변
또 다른 가능성은 유형을 정의하는 것입니다. 두 필드에 대해 동일한 크기를 보장하고 싶다는 사실은 두 필드에 대해 동일한 의미를 가지고 있음을 나타내는 지표라고 생각합니다.
typedef char description[255];
그리고 필드가
description text;
두 유형 모두에서.