Namespaces
Variants

offsetof

From cppreference.net
< c ‎ | types
헤더 파일에 정의됨 <stddef.h>
#define offsetof(type, member) /*implementation-defined*/

매크로 offsetof 정수 상수 표현식 으로 확장되며, 그 값은 지정된 타입의 객체 시작점부터 지정된 하위 객체까지의 바이트 단위 오프셋으로, 패딩이 있는 경우 이를 포함합니다.

정적 저장 기간을 가진 type 타입의 객체 o 가 주어졌을 때, & ( o. member ) 는 주소 상수 표현식이어야 하며 o 의 하위 객체를 가리켜야 합니다. 그렇지 않으면 동작은 정의되지 않습니다.

type 에 지정된 타입 이름이 일치하는 괄호 사이에 있지 않은 쉼표를 포함하는 경우, 동작은 정의되지 않습니다.

(C23부터)

목차

참고 사항

만약 offsetof 가 비트 필드 멤버에 적용되면, 비트 필드의 주소를 취할 수 없기 때문에 동작은 정의되지 않습니다.

member 는 직접 멤버로 제한되지 않습니다. 이는 배열 멤버의 요소와 같이 주어진 멤버의 하위 객체를 나타낼 수 있습니다.

C23에서 괄호로 묶지 않은 쉼표를 포함하는 새로운 타입을 offsetof 에 지정하는 것이 정의되지 않은 동작으로 명시되었지만, 이러한 사용법은 일반적으로 이전 모드에서도 지원되지 않습니다: offsetof ( struct Foo { int a, b ; } , a ) 는 일반적으로 컴파일되지 않습니다.

typeof 는 새로운 타입 정의에서 쉼표의 부작용을 피하기 위해 사용될 수 있습니다. 예를 들어, offsetof ( typeof ( struct { int i, j ; } ) , i ) 는 올바르게 정의됩니다.

(C23부터)

예제

#include <stdio.h>
#include <stddef.h>
struct S {
    char c;
    double d;
};
int main(void)
{
    printf("the first element is at offset %zu\n", offsetof(struct S, c));
    printf("the double is at offset %zu\n", offsetof(struct S, d));
}

가능한 출력:

the first element is at offset 0
the double is at offset 8

결함 보고서

다음의 동작 변경 결함 보고서들은 이전에 발표된 C 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
DR 496 C89 구조체와 구조체 멤버만 언급됨 공용체 및 다른 하위 객체들도 지원됨

참고 항목

sizeof 연산자가 반환하는 부호 없는 정수형
(typedef)
C++ documentation for offsetof