C : 크기를 수행하는 더 나은 방법 (((SOMESTRUCT *) 0)-> some_member)?

StackOverflow https://stackoverflow.com/questions/1014750

  •  06-07-2019
  •  | 
  •  

문제

구조물에서 특정 멤버의 크기를 얻고 싶습니다.

sizeof(((SomeStruct *) 0)->some_member) 나를 위해 일하지만 더 좋은 방법이있을 것 같아요.

나는 할 수있다 #define SIZEOF_ELEM(STRUCT, ELEM) sizeof(((STRUCT *) 0)->ELEM) 그리고 사용하십시오 SIZEOF_ELEM(SomeStruct, some_member), 그러나 나는 이미 더 나은 내장이 있는지 궁금합니다.

내 특정 사용 사례는 HSC2HS (Haskell C 바인딩)에 있습니다.

pokeArray (plusPtr context (#offset AVFormatContext, filename)) .
  take (#size ((AVFormatContext *) 0)->filename) .
  (++ repeat '\NUL') $ filename
도움이 되었습니까?

해결책

당신이 가진 것은 당신이 피로 변수를 보장 할 수 없다면 얻는 것만 큼 깨끗합니다. (가능하다면 만 사용하십시오 sizeof(var.member) 또는 sizeof(ptr->member), 물론, 이것은 컴파일 타임 상수가 필요한 일부 상황에서는 작동하지 않습니다.)

오래 전에 (1990 년경), 나는 컴파일러를 만났다.offsetof'기본 주소 0을 사용하여 정의되어 충돌했습니다. 나는 해킹으로 문제를 해결했다 <stddef.h> 0 대신 1024를 사용하려면 지금 그러한 문제가 발생하지 않아야합니다.

다른 팁

나는 당신이 이미 올바른 솔루션을 가지고 있다고 생각합니다. stddef.h를 파고 매우 유사한 일을하기 때문에 오프셋이 어떻게 정의되는지를 찾을 수 있습니다.

패딩으로 인해 멤버의 크기와 해당 부재의 오프셋과 다음 멤버의 오프셋 사이의 차이 사이에 차이가있을 수 있습니다.

C ++에서는 크기를 수행 할 수 있지만 (SOMESTRUCT :: SOME_MEMBER)는 C이며 스코프 해상도 연산자가 없습니다. 당신이 쓴 것은 내가 아는 한 쓸 수있는만큼 좋습니다.

Microsoft는 헤더 중 하나에 다음과 같습니다.

#define RTL_FIELD_SIZE(type, field) (sizeof(((type *)0)->field))

나는 다른 일을 할 이유가 없다.

그들은 다음과 관련된 매크로를 가지고 있습니다.

RTL_SIZEOF_THROUGH_FIELD()
RTL_CONTAINS_FIELD()

그리고 Nifty :

CONTAINING_RECORD() 

이는 링크 필드가 구조물의 시작에 있어야하지 않아도 직선 C에서 일반 목록을 구현하는 데 도움이됩니다. 이것 좀 봐 커널 머스타드 기사 자세한 내용은.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top