[c]
[C/C++] offsetof 매크로
Gernii K
2024. 6. 12. 09:34
업무중 클라이언트로부터 데이터를 넘겨받는데 구조체를 사용해야 한 적이 있다.
이때 if(데이터 이름 == "원하는 이름") else if ( 반복 ) ... 으로 처리해서 코드 가독성이 추락한적이 있는데 이 때 찾아본 방법이 바로 offsetof 매크로이다.
C++ 메크로인줄 알았는데 C에서도 사용 가능하다고 하니 참고하세요
offsetof 이지만, 직접 define을 할때 그냥 이름을 OFFSET으로만 설정하였다.
형태는 구조체인 type과 원하는 항목인 field로 이루어져있고 offset(위치)를 찾고자 하므로 size_t가 사용되었다.
먼저 찾고자 하는 항목인 key
해당 key의 위치인 offset
t_offset tOffset[] = {
{"key1", OFFSET(t_structure, key)},
{"key2", OFFSET(t_structure, key2)}
};
찾고자 하는 항목의 이름을 key라고 할 때 key값과 OFFSET(사용하는 구조체, 찾고자하는 항목의 이름) 으로 구성한다.
for(int i = 0; i < sizeof(tOffset) / sieof(tOffset[0]); i++)
{
if(strcmp(tOffset[i].key, "들어온 데이터의 이름")
{
void *ptr = (void *)((char *)구조체 + tOffset[i].offset);
ptr로 데이터 처리
}
}
들어온 데이터의 key값이 일치하면 그 offset에 key값과 같이들어온 value값을 처리하는 형태이다.
여기서
void *ptr은 데이터 타입에 구애받지 않기 위함이고
구조체 앞에 (char *)로 형변환을 하는 이유는 offset을 1바이트씩 처리하기 위해서이다.
형변환을 하지 않으면 구조체 크기만큼 점프하기 때문에 offset을 찾을 수 없음.
설명이 개떡같지만 도움이 되었음 합니다.