프로그래밍/C,C++,C#

[C,C++,C#] 전처리 ##연산자

Beginner:) 2023. 6. 4.
320x100

C계열에 ##연산자가 있다.

 

##의 의미는 "이어준다"라는 의미이다.

 

전처리이기 때문에 치환을 하고 컴파일을 하기 때문에 가능하다.

 

아래는 예제코드와 결과이다.

배열을 써서 for문을 사용하여 초기화하여도 되나,

배열을 사용하면 안 될 때가 있을 시(있는진 모르겠지만) 이런 방식도 있다. 

#define MAKE_VAR(n) int var_##n = 100+n;
#define VAR_PRINT(n) printf("%d\n",var_##n);
#include <stdio.h>

int main()
{
    for(int i=0;i<=5;i++)
    {
        MAKE_VAR(i);
        VAR_PRINT(i);
        // or prinft("%d\n", var_0 ~ var_5);
    }

    return 0;
}

 

 

또 다른 예제로는 레지스터 코딩할 때 사용하면 편리하다.

현재 MCU가 없어서 아래 블로그를 참고

https://3larvas.tistory.com/11

 

레지스터 Address를 보면 PIO[name]가 반복되고, 주소값 앞의 0x400E가 반복된다.

또한 0x - 16진수로 되어있고 8byte이기 때문에 long long 선언과 끝에 심볼 L을 넣어줘야 깔끔한데

이것을 ##연산자로 보기 편하게 사용해보자.

 

#define MAKE_VAR(n,v) unsigned long long PIO##n = 0x400E##v##L; 

#include <stdio.h>

int main()
{
    MAKE_VAR(A,0E10);
    printf("PIOA : %llX\n", PIOA);

    MAKE_VAR(B,1010);
    printf("PIOB : %llX\n", PIOB);

    MAKE_VAR(C,1210);
    printf("PIOC : %llX\n", PIOC);

    MAKE_VAR(D,1610);
    printf("PIOD : %llX\n", PIOD);

    MAKE_VAR(E,1810);
    printf("PIOE : %llX\n", PIOE);

    return 0;
}

 

printf 또한 ##연산자로 깔끔히 처리할 수 있지만, 귀찮다.

반응형

댓글