ProgrammingLang/c++

[매크로] macro 사용시 유용한 것

jinkwon.kim 2021. 7. 3. 19:15
728x90
반응형

# 의 의미 

매크로에서 # 연산자는 문자열로 치환 시켜주는 연산자 입니다.

아래 코드에서 TEST\n은 define에서 "TEST\n" 으로 치환이 됩니다. 

1) 기본

#include  <iostream>

#define PRINT(s) printf(#s)

int main()
{
    PRINT(TEST\n);
}

>TEST

 

2) 응용

가변 인자를 사용하여 macro를 다양하게 만들기

define 선언 부분에서 가변인자는 ... 으로 표시 되며 정의 부분에서는 ##__VAR_ARGS__ 와 mapping이 됩니다.

가변 인자 참고 사이트

    - https://jhnyang.tistory.com/298

#include  <iostream>

#define PRINT(s, ...) printf(#s, ##__VA_ARGS__)

int main()
{
    PRINT(TEST000   0 %d\n, 10);
}

##의 의미

##은 두 개의 토큰을 이어준다. 혹은 붙여준다. 의 의미로 생각하시면 됩니다. 

OpenSSL에서 유용하게 사용되며 예제는 다음과 같습니다. 

예 ) 구조체이름이 길고 뒤에 접미사만 바뀔때 유용 합니다.

    - 아래 코드에서 STACK_OF(type) 정의를 보면 구조체의 뒷부분만 type을 사용해서 변경 하고 있습니다.

      즉 stack_st_ 과 type을 이어서 표현 할 수 있게 해줍니다.

# define STACK_OF(type) struct stack_st_##type

STACK_OF(SSL_CIPHER) *cipher_list;
/* same as above but sorted for lookup */
STACK_OF(SSL_CIPHER) *cipher_list_by_id;
/* TLSv1.3 specific ciphersuites */
STACK_OF(SSL_CIPHER) *tls13_ciphersuites;
728x90
반응형