모델 애니메이션 구현 작업을 하던 도중 Position, Rotation, Scale 세 가지 요소들의 키프레임 갯수 중 가장 많은게 무엇인지 알아내야하는 상황이 생겼다. c++ 11 이상부터 algorithm 라이브러리를 참조할 시 std::max({ v1, v2, v3... }) 의 형태로 간단하게 최대값을 알아내는게 가능하다. 본인의 엔진 개발은 c++ 20의 환경에서 진행되고 있으므로 전혀 문제가 되지 않을 것임에도 불구하고 컴파일러는 에러를 뱉어냈다. 혹시 c++ 20에서 중괄호를 작성하지 않는 것으로 바뀐건가 싶어 중괄호를 지워보니 작동은 됐지만 첫번째, 두번째 인자만 비교하고 그 이후의 인자에 대한 비교는 이루어지지 않았다.
원인은 window 라이브러리에 포함된 minwindef.h 에 정의된 매크로였다. 이 녀석은 똑같이 max( v1, v2 ) 의 방식으로 사용되는 최대값 비교 매크로 함수였다. 불론 min도 똑같이 구현돼있다. 이 녀석이 매크로로 정의되는 바람에 애먼 std::max()가 호출되지 못하고 있는 것이었다. 해결 방법은 단순히 라이브러리를 참조하기 이전에 NOMINMAX 매크로를 정의해주면 된다.
/*pch.h*/
#pragma once
// Debuging Console
#pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")
#define WIN32_LEAN_AND_MEAN
#define NOMINMAX // <- 이부분
// STL
#include <memory>
#include <iostream>
#include <array>
#include <vector>
#include <list>
#include <map>
#include <unordered_map>
#include <algorithm>
#include <filesystem>
using namespace std;
// Win
#include <windows.h>
#include <windowsx.h>
#include <assert.h>
#include <comdef.h>
...
이렇게 매크로를 정의해두면 아래에서 볼 수 있다시피 minwindef.h 의 min/max 매크로 함수 정의가 이뤄지지 않아 문제가 해결된다.
/*minwindef.h*/
...
#ifndef NOMINMAX
#ifndef max
#define max(a,b) (((a) > (b)) ? (a) : (b))
#endif
#ifndef min
#define min(a,b) (((a) < (b)) ? (a) : (b))
#endif
#endif /* NOMINMAX */
...
Reference
https://stackoverflow.com/questions/22744262/cant-call-stdmax-because-minwindef-h-defines-max
'공부 > DirectX12' 카테고리의 다른 글
| Lazy Update(Propagation)를 적용한 Transform (0) | 2025.08.13 |
|---|---|
| DirectX12 콜라이더 디버깅을 위한 직선 렌더링 시스템 구현 (1) | 2025.07.09 |
| DirectX12 ImGUI 라이브러리 세팅 (0) | 2025.04.15 |
| 메시와 머터리얼의 관계에 따른 문제 발생 및 해결 (0) | 2025.04.10 |
| 툰 셰이딩에서 얼굴 명암 처리에 대해서 (0) | 2025.04.04 |