2009-12-15 6 views
55

이 줄은 작은 테스트 프로그램에서 제대로 작동하지만 내가하고자하는 프로그램에, 나는 다음과 같은 컴파일러 불만 얻을 :경고 C4003 및 C2589 및 C2059 오류 : x = std :: numeric_limits <int> :: max();

#include <limits> 
using namespace std; 

x = numeric_limits<int>::max(); 

:

#include <limits> 

x = std::numeric_limits<int>::max(); 

c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max' 
c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::' 
c:\...\x.cpp(192) : error C2059: syntax error : '::' 

내가 가진 동일한 결과를 얻을 수를 max가 매크로 max (a, b)로 보이는 이유는 무엇입니까? ?

+0

내 경우에는'-DNOMINMAX'없이 내부 컴파일러 오류가 발생했습니다. 마이크로 소프트가 끊임없이 자신을 상대로 어떻게 투쟁하고 있는지 보는 것은 재미있다. –

답변

74

합니다. Windows 헤더를 사용하는 경우 코드에 #define NOMINMAX을 입력하거나 동일한 컴파일러 스위치로 빌드하십시오 (예 : /Visual Studio의 경우 DNOMINMAX).

NOMINMAX을 사용하여 작성하면 전체 프로그램에서 매크로를 사용할 수 없습니다. min 또는 max 작업을 사용해야하는 경우 <algorithm> 헤더의 std::min() 또는 std::max()을 사용하십시오.

+0

좋아, 그냥 물어 봐야 해 ... 두 파일을 같은 파일에 둘 수 있습니까? x = std :: numeric_limits :: max(); // 약간의 까다로운 프리 프로세서 명령 c = max (a, b); – Harvey

+0

@Harvey : 한 파일에서 max() 및 max() 매크로의 사용을 해결하기 위해 내 대답을 편집했습니다. –

+0

이 프로젝트의 다른 파일에서 min() 및 max()를 사용하고 미리 컴파일 된 헤더를 사용하면 모든 파일에서 사용할 수 없습니다. #undef max는 필자의 경우에 효과적이며 파일의 나머지 부분에만 유효합니다. – Harvey

27

일부 다른 헤더 파일은 max 매크로로 전역 이름 공간을 오염시킵니다. 당신은 매크로를 정의 해제하여 해당 문제를 해결할 수 있습니다하십시오 min 또는 max 매크로를 정의하는 윈도우 헤더를 포함 할 때 일반적으로 발생

#undef max 
x = std::numeric_limits<int>::max(); 
+5

이런 식으로 고쳐서는 안되며, 처음에 NOMINMAX로 정의를 막을 수 있습니다. – GManNickG

61

다른 해결책은 다음과 같이 괄호로 함수 이름을 래핑하는 것입니다 : (std::numeric_limits<int>::max)(). std::max에도 동일하게 적용됩니다.

NOMINMAX는 더 나은 IMO이지만, 경우에 따라 옵션이 될 수 있습니다.

static _Ty (max)() _THROW0() 
{ // return maximum value 
    return (FLT_MAX); 
} 

을 그래서 난 그냥 FLT_MAX을 사용하고 다음과 같이

+1

글로벌 min/max 매크로를 사용하는 것이 싫기 때문에 때로는 프로젝트에서 매크로를 완전히 제거하는 것이 까다로울 때도 있습니다. 해결책으로 생각하지 마십시오. +1. – icabod

+6

불행히도 min 및 max 매크로는 Windows Platform SDK (예 : GDI + GdiplusTypes.h)에서 널리 사용됩니다. 그래서 답은 NOMINMAX를 정의하는 것이 좋습니다. +1! – 23W

+0

포장은 여기에서 어떻게 도움이됩니까? 정말 혼란 스럽습니까, 조금 설명해 주시겠습니까? – sami1592

3
#ifdef max 
#pragma push_macro("max") 
#undef max 
#define _restore_max_ 
#endif 

#include <limits> 

//... your stuff that uses limits 

#ifdef _restore_max_ 
#pragma pop_macro("max") 
#undef _restore_max_ 
#endif 
+0

@MattMcNabb 바 꾸었습니다. – dmjalund

0

비주얼 스튜디오 2013에서 나를 위해에있는 그것의 정의 (더 나은 간격 포맷은 ...)입니다. :) 이것은 보편적 인 해결책은 아니지만 내 경우에는 잘 작동하므로 공유 할 것이라고 생각했습니다.

+1

'FLT_MAX '에 접근하려면'#include '이 필요합니다. –