source

C의 단일 구조 부재 크기

goodcode 2022. 8. 10. 22:18
반응형

C의 단일 구조 부재 크기

나는 다른 구조물에 의존하는 구조를 선언하려고 한다.사용하고 싶다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?

버퍼 크기를 정의하는데,#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)


편집: I like the member_size macro Joey suggested using this technique, I think I would use that.

자유롭게 사용하실 수 있습니다.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;
}

그러나 헤더를 보면 이것은 BSD로 ANSI 또는 POSIX 규격이 아닌 것으로 보입니다.Linux 머신으로 시험해 봤는데 작동이 안 돼서 유용성이 제한됐어요.

다른 방법은 유형을 정의하는 것입니다.두 필드에 대해 동일한 크기를 보장하고자 한다는 것은 동일한 의미론을 가지고 있다는 것을 보여주는 지표라고 생각합니다.

typedef char description[255];

그리고 밭을 가지고

description text;

두 가지 타입에서요

c++ 솔루션:

size of (Type:: member)도 동작하고 있는 것 같습니다.

struct Parent
{
    float calc;
    char text[255];
    int used;
};

struct Child
{
    char flag;
    char text[sizeof(Parent::text)];
    int used;
};

@http-http: 감사합니다!저도 같은 것을 검색했지만 문자 배열이 아닌 경우 이렇게 해도 완벽하게 작동합니다.

#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])

언급URL : https://stackoverflow.com/questions/3553296/sizeof-single-struct-member-in-c

반응형