#define _WIN32_WINNT 0x0500 // enable Win 2K features
#define WINVER 0x0500 // enable 98/2K features
#define _WIN32_IE 0x0400 // enable IE4+ features
이러한 것들을 헤더에서 정의해 주는 이유는 사용할 API의 한계를 결정짓기 위해서다. 윈도우 API의 경우 새로운 운영체제가 나오거나, 새로운 인터넷 익스플로러가 출시될 때마다 추가되는 경향이 있다. 최신 운영체제에서만 지원하는 API를 사용한 경우 그 운영체제보다 아래의 버전에서는 해당 프로그램이 동작하지 않는다는 이야기다.
예를 들면 InterlockedExchangeAdd란 API는 윈도우 98부터 사용할 수 있다. 윈도우 95에는 해당 API가 존재하지 않는 것이다. 따라서 윈도우 95에서 동작하는 프로그램을 만든다면 위 API는 사용해서는 안 된다. 윈도우 API는 수천 가지도 넘게 존재하고 앞으로도 계속 추가될 것이다. 이러한 API 하나하나에 대한 지원정보를 프로그래머가 일일이 구분해서 사용한다는 것은 매우 힘든 일이다. 그래서 프로그램을 개발할 때에 위와 같은 매크로를 통해서 이 프로그램이 동작할 수 있는 하한선을 정의함으로써 그 보다 더 높은 시스템만 지원하는 API는 컴파일 시 포함되지 않게 하는 것이다. 이로써 프로그래머가 해당 시스템에선 사용할 수 없는 API를 쓰는 실수를 하게 된다면 컴파일러는 오류를 발생시켜 알려줄 수 있는 것이다.
Read more: http://www.jiniya.net/wp/archives/2215#ixzz4sdJO4L3T