전처리기 – #, ##

#과 ##은 전처리기의 연산자로서 #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

Leave a Reply

Your email address will not be published. Required fields are marked *