[c] C의 단일 구조체 멤버 sizeof

다른 구조체에 종속 된 구조체를 선언하려고합니다. 나는 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;

두 유형 모두에서.