offsetof
|
헤더 파일에 정의됨
<stddef.h>
|
||
|
#define offsetof(type, member) /*implementation-defined*/
|
||
매크로 offsetof 는 정수 상수 표현식 으로 확장되며, 그 값은 지정된 타입의 객체 시작점부터 지정된 하위 객체까지의 바이트 단위 오프셋으로, 패딩이 있는 경우 이를 포함합니다.
정적 저장 기간을 가진
type
타입의 객체
o
가 주어졌을 때,
&
(
o.
member
)
는 주소 상수 표현식이어야 하며
o
의 하위 객체를 가리켜야 합니다. 그렇지 않으면 동작은 정의되지 않습니다.
|
|
(C23부터) |
목차 |
참고 사항
만약
offsetof
가 비트 필드 멤버에 적용되면, 비트 필드의 주소를 취할 수 없기 때문에 동작은 정의되지 않습니다.
member
는 직접 멤버로 제한되지 않습니다. 이는 배열 멤버의 요소와 같이 주어진 멤버의 하위 객체를 나타낼 수 있습니다.
C23에서 괄호로 묶지 않은 쉼표를 포함하는 새로운 타입을
offsetof
에 지정하는 것이 정의되지 않은 동작으로 명시되었지만, 이러한 사용법은 일반적으로 이전 모드에서도 지원되지 않습니다:
offsetof
(
struct
Foo
{
int
a, b
;
}
, a
)
는 일반적으로 컴파일되지 않습니다.
|
typeof 는 새로운 타입 정의에서 쉼표의 부작용을 피하기 위해 사용될 수 있습니다. 예를 들어, offsetof ( typeof ( struct { int i, j ; } ) , i ) 는 올바르게 정의됩니다. |
(C23부터) |
예제
가능한 출력:
the first element is at offset 0 the double is at offset 8
결함 보고서
다음의 동작 변경 결함 보고서들은 이전에 발표된 C 표준에 소급 적용되었습니다.
| DR | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| DR 496 | C89 | 구조체와 구조체 멤버만 언급됨 | 공용체 및 다른 하위 객체들도 지원됨 |
참고 항목
|
sizeof
연산자가 반환하는 부호 없는 정수형
(typedef) |
|
|
C++ documentation
for
offsetof
|
|