[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을 찾을 수 없음.

 

 

설명이 개떡같지만 도움이 되었음 합니다.