본문 바로가기

프로그래밍/C++

[C++] 매크로에서 반복문 조건이 작동하는 방식

반응형

C++에서는 다음과 같이 매크로를 사용할 수 있다.

#include<bits/stdc++.h>

#define FOR(i, N) for(int i = 0; i < N; ++i)

using namespace std;

int main() {
    FOR(i, 10)
    	cout << i;
    // it is same as...
    // for (int i = 0; i < 10; ++i)
    return 0;
}

// output:
// 0123456789

여기서 N에 해당하는 위치에 함수를 넣으면 어떻게 될까?

1. 매크로에서 N의 값을 초기화하는 과정에서 함수가 처음 1회 실행된다.

2. 매 조건을 확인할 때마다 함수가 실행된다.


정답은 2번이다. 매크로에서는 N에 데이터가 아니라 코드를 대입한다.

#include <bits/stdc++.h>

#define FOR(i, N) for (int i = 0; i < N; ++i)

  using namespace std;

int func() {
  cout << "called" << endl;
  return 3;
}

int main() {
  FOR(i, func())
  cout << 0;
  return 0;
}

// output:
// called0
// called0
// called0

따라서 N의 위치에 적은 코드가 그대로 매크로 정의에서 N의 위치에 대입된다고 생각하면 된다.

따라서 매크로를 사용할 때, 반복문 조건 부분에 vector<T>::size()와 같이 (벡터의 크기가 일정할 때)매 번 같은 값을 반환하는 함수는 따로 상수를 선언하여 사용하는 것이 바람직하다.

반응형