development

경고 C4003 및 오류 C2589 및 C2059 on : x = std :: numeric_limits

big-blog 2020. 12. 26. 16:30
반응형

경고 C4003 및 오류 C2589 및 C2059 on : x = std :: numeric_limits:: 최대 ();


이 줄은 작은 테스트 프로그램에서는 제대로 작동하지만 원하는 프로그램에서는 다음과 같은 컴파일러 불만이 발생합니다.

#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 : '::'

나는 다음과 같은 결과를 얻습니다.

#include <limits>
using namespace std;

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

왜 max를 매크로 max (a, b); ?


이는 일반적으로 min또는 max매크로 를 정의하는 Windows 헤더를 포함 할 때 발생합니다 . Windows 헤더를 사용하는 경우 #define NOMINMAX코드를 입력하거나 동등한 컴파일러 스위치로 빌드합니다 (예 : Visual Studio의 경우 / DNOMINMAX 사용 ).

로 빌드 NOMINMAX하면 전체 프로그램에서 매크로를 사용할 수 없습니다. 당신은 사용해야 할 경우 min또는 max작업, 사용 std::min()또는 std::max()로부터 <algorithm>헤더를.


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

이것이 좋은 해결책인지 확실하지 않습니다 ... NOMINMAX가 더 나은 IMO이지만 어떤 경우에는 옵션이 될 수 있습니다.


다른 헤더 파일이 max 매크로로 전역 이름 공간을 오염시키고 있습니다. 매크로를 정의 해제하여 수정할 수 있습니다.

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

#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

Visual Studio 2013의 정의 (더 나은 간격을 위해 형식 지정됨 ...)는 다음과 같습니다.

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

그래서 저는 FLT_MAX를 사용하고 있습니다. :) 이것은 보편적 인 해결책이 아닐 수 있지만 제 경우에는 잘 작동하므로 공유 할 것이라고 생각했습니다.


(std :: numeric_limits :: max) ()

파이처럼 쉽습니다.

참조 URL : https://stackoverflow.com/questions/1904635/warning-c4003-and-errors-c2589-and-c2059-on-x-stdnumeric-limitsintmax

반응형