경고 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) ()
파이처럼 쉽습니다.
'development' 카테고리의 다른 글
Graphics.DrawString ()의 중앙 텍스트 출력 (0) | 2020.12.26 |
---|---|
VB.NET의 임의 정수 (0) | 2020.12.26 |
HashMap에서 검색된 값의 순서가 삽입 순서입니다. (0) | 2020.12.26 |
동적 조건이있는 Rails has_many (0) | 2020.12.26 |
매우 간단한 연결 목록 만들기 (0) | 2020.12.26 |