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
'source' 카테고리의 다른 글
| C에 화살표(->) 연산자가 존재하는 이유는 무엇입니까? (0) | 2022.08.10 |
|---|---|
| C/C++ 매크로의 쉼표 (0) | 2022.08.10 |
| Java에서 데몬 스레드란 무엇입니까? (0) | 2022.08.10 |
| Java에서 문자열이 정수인지 확인 (0) | 2022.08.10 |
| vuex.disc 글로벌오류 핸들러 상태 (0) | 2022.08.10 |