본문 바로가기
Development/헷갈리는 C언어

[C언어]전처리기?#define의 # or ##연산자? 그게머임?

by 루카오리 2013. 7. 17.

 

#과 ##은 전처리기의 연산자로서 #define 전처리 과정에서만 사용하는 특수한 연산자이다. 사용 빈도가 높지는 않지만 잘 알아 두면 매크로의 활용도를 높여 반복되는 코드를 간단하게 작성할 수 있다.

Stringizing Operator - #
#define문의 인수 앞에 사용되며 피연산자를 문자열로 바꾸는 역할을 한다. 피연산자가 실인수로 치환된 후 양쪽에 따옴표를 붙여 치환된 결과 그대로 문자열 상수가 된다.

#define result(exp) printf(#exp" = %d\n",exp);

 

void main()

{

     result(5*3);

     result(2*(3+1));

}

결과는 
5*3 = 15
2*(3+1)  = 8

Merge Operator - ##
#define 문 내에서만 사용되며 형식 인수 사이에 위치한다. 형식 인수를 분리하여 각각 치환되도록 하며 치환 후에는 주변의 공백과 함께 사라져 두 인수의 치환 결과가 하나의 토큰으로 연결될 수 있도록 한다.

#define var(a,b) (a##b)

 

void main()

{

     int var(Total, Score);

     TotalScore=256;

     printf("총점 = %d\n",TotalScore);

}


이해를 위해 또 다른 예제를 보면...

#include <iostream>
 
//make function factory and use it
#define FUNCTION(name, a) int fun_##name() { return a;}
 
FUNCTION(abcd, 12);
FUNCTION(fff, 2);
FUNCTION(kkk, 23);
 
#undef FUNCTION
#define FUNCTION 34
#define OUTPUT(a) std::cout << #a << std::endl
 
int main()
{
    std::cout << "abcd: " << fun_abcd() << std::endl;
    std::cout << "fff: " << fun_fff() << std::endl;
    std::cout << "kkk: " << fun_kkk() << std::endl;
    std::cout << FUNCTION << std::endl;
    OUTPUT(million);               //note the lack of quotes
 
    return 0;
}

Output:

abcd: 12
fff: 2
kkk: 23
34
million

퍼옴~ : <http://liketheocean.tistory.com/entry/%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0>

'Development > 헷갈리는 C언어' 카테고리의 다른 글

[C언어]C언어 자료형~^^  (0) 2013.07.16