글 작성자: astrocosmos

코드를 효과적으로 구현하기 위해 이것저것 보다가
#define문에서 paste token이라고 말하는 "##"의 사용법을 정리합니다.

그래서!!
이 ACID와 AI_SN의 값을 가져오고(GET), 세팅하는(SET) 함수가 필요한데
UL/DL에 대해서 모두 ACID와 AI_SN이 필요합니다.

이것을 아래와 같은 함수형태로 구현하고 싶었습니다.

int harq_ul_aisn[MAX_ACID];
int harq_dl_aisn[MAX_ACID];

int main(void) 
{
  int ul_aisn = HARQ_GET_AISN(ul, acid);
  int dl_aisn = HARQ_GET_AISN(dl, acid);

  HARQ_SET_AISN(ul, acid, ul_aisn^1);
  HARQ_SET_AISN(dl, acid, dl_aisn^1);

  return 0;
}

 

함수보다는 #define문으로 구현하고 싶었습니다.
그래서!! #define문의 "##"(paste token)을 이용하여 아래와 같이 구현했습니다.

#define HARQ_GET_AISN(dir, acid)        (harq_##dir##_aisn[acid])
#define HARQ_SET_AISN(dir, acid, val)   (harq_##dir##_aisn[acid] = val)

위 코드에서 "##"이 어떤식으로 쓰였는지 알 수 있습니다.
토큰은 전처리 과정에서 처리되는데 명칭, 숫자, 문자열, 문자, 구두점 등으로 구분이 됩니다.
harq_##dir##_aisn[acid] 의 dir에 "ul", "dl"이라는 명칭을 넣었습니다.

따라서, 
HARQ_GET_AISN(ul, acid) 는 전처리 과정에서 harq_ul_aisn[acid]로 대체될 겁니다.
위에는 토큰이 중간에 위치하는 경우이고, 토큰이 맨앞이나 맨뒤에 위치할 경우에는 연결되는 부위에만 "##"을 넣어주시면 됩니다.

예를 들면 아래 코드와 같습니다.


토큰이 맨 앞에 위치할 경우

int ul_harq_aisn[MAX_ACID];
int dl_harq_aisn[MAX_ACID];

#define HARQ_GET_AISN(dir, acid)        (dir##_harq_aisn[acid])
#define HARQ_SET_AISN(dir, acid, val)   (dir##_harq_aisn[acid] = val)

int main(void) 
{
	int ul_aisn = HARQ_GET_AISN(ul, acid);
	int dl_aisn = HARQ_GET_AISN(dl, acid);

	HARQ_SET_AISN(ul, acid, ul_aisn^1);
	HARQ_SET_AISN(dl, acid, dl_aisn^1);

	return 0;
}

 


토큰이 맨 뒤에 위치할 경우

int harq_aisn_ul[MAX_ACID];
int harq_aisn_dl[MAX_ACID];

#define HARQ_GET_AISN(dir, acid)        (harq_aisn_##dir[acid])
#define HARQ_SET_AISN(dir, acid, val)   (harq_aisn_##dir[acid] = val)

int main(void) 
{
	int ul_aisn = HARQ_GET_AISN(ul, acid);
	int dl_aisn = HARQ_GET_AISN(dl, acid);

	HARQ_SET_AISN(ul, acid, ul_aisn^1);
	HARQ_SET_AISN(dl, acid, dl_aisn^1);

	return 0;
}

 

이런식으로 "##" paste token을 사용하시면 됩니다.
대부분의 C를 해오신 분들을 명확히 알고 계시겟지만, 초보자나 일부 몰랐던 분들을 위해서 정리할 겸 포스팅합니다.^^

도움이 되셨으면 좋겠네요.

 

728x90