매크로

2022. 4. 9. 01:02C++

#define을 이용해 다음과 같은 코드가 가능하다. 

#include<iostream>
using namespace std;

#define PRINT_HELLO cout<<"HELLO"<<endl;

int main(void)
{
    PRINT_HELLO;    //HELLO 출력
    return 0;
}

 

함수에서의 매크로

int square(int a){
    return a*a;
}

위와 같은 함수를 아래와 같이 매크로 함수로 만들수 있다. 

#define SQUARE(X) X*X

 

위는 아래와 같은 문제가 발생한다. 

#include <iostream>

using namespace std;
#define SQUARE(X) X*X

int square(int a){
    return a*a;
}

int main(){
    int a = 5;
    cout<<100/square(a)<<endl;  // 4, 100/25 = 4
    cout<<100/SQUARE(a)<<endl;  //100, 100/5*5 = 100
    return 0;
}

 

 

물론 이는 전체 식에 괄호를 침으로써 해결할 수 있다. 

#define SQUARE(X) (X*X)

 

하지만 이는 끝이 아니다. 

#include <iostream>

using namespace std;
#define SQUARE(X) (X*X)

int square(int a){
    return a*a;
}

int main(){
    int a = 6;
    cout<<square(a-1)<<endl;  // 25, 5*5
    cout<<SQUARE(a-1)<<endl;  //-1, 6-1 * 6-1 = -1 
    return 0;
}

 

그렇기에 각 요소에도 괄호를 침으로써 더욱 안전한 식을 만들어야 한다. 

#define SQUARE(X) ((X)*(X))

 

매개변수가 두 개인 매크로 함수

아래와 같이 최댓값을 반환하는 함수가 있다고 하자. 

int max(int a, int b){
    // if (a > b) return a;
    return (a>b) ? a : b; //삼항 연산자.   
}

이는 아래와 같이 매크로 함수를 만들 수 있다. 

#define MAX(A,B) (((A)>(B)) ? (A) : (B))

 

 

'C++' 카테고리의 다른 글

범위지정 연산자  (0) 2022.04.09
inline 함수  (0) 2022.04.09
상수  (0) 2022.04.09
동적 할당  (0) 2022.04.03
연산자 오버라이딩  (0) 2022.04.03