std::max, std::min을 사용할 때 컴파일 오류

아래와 같이 콘솔 응용프로그램을 만들어 컴파일을 해 보면

#define _WIN32_WINNT _WIN32_WINNT_XP
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>

#include <iostream>
#include <algorithm>

int wmain()
{
	int a = 10;
	int b = 20;
	int c = std::min(a, b);
	std::cout << c << std::endl;
	return 0;
}

1>  main.cpp
1>e:\temp\test\main.cpp(12): error C2589: '(' : '::' 오른쪽에 잘못된 토큰이 있습니다.
1>e:\temp\test\main.cpp(12): error C2059: 구문 오류 : '::'

와 같은 결과를 얻습니다.

원인을 찾아보면 windows.h 헤더 파일에서 min과 max를 전처리기 매크로로 정의를 해서 발생하는 문제입니다.
왜! 하필! 이걸 매크로로 정의를 했을까요???

그런데 그 부분을 조금 더 살펴보면
NOMINMAX가 정의되어 있으면 min, max 정의를 사용하지 않게 되어 있습니다.

그럼 소스를 아래와 같이 수정하면…

#define _WIN32_WINNT _WIN32_WINNT_XP
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
#include <Windows.h>

#include <iostream>
#include <algorithm>

int wmain()
{
	int a = 10;
	int b = 20;
	int c = std::min(a, b);
	std::cout << c << std::endl;
	return 0;
}

원하는 결과를 얻을 수 있습니다.

C++에서 요새 자주 쓰이는 boost나 STL을 생각한다면…
대부분의 코드에서 NOMINMAX는 필수가 아닐까 생각됩니다.

글쓴이

BS

BS == Programmer