std :: numeric_limits :: max的语法错误

mmo*_*jab 38 c++ syntax syntax-error visual-c++ numeric-limits

我有类结构定义如下:

#include <limits>

struct heapStatsFilters
{
    heapStatsFilters(size_t minValue_ = 0, size_t maxValue_ = std::numeric_limits<size_t>::max())
    { 
         minMax[0] = minValue_; minMax[1] = maxValue_; 
    }

    size_t minMax[2];
};
Run Code Online (Sandbox Code Playgroud)

问题是我不能使用'std :: numeric_limits :: max()'并且编译器说:

Error 8 error C2059: syntax error : '::'

Error 7 error C2589: '(' : illegal token on right side of '::'

我使用的编译器是Visual C++ 11(2012)

Pio*_*cki 86

你的问题是由原因引起的<Windows.h>,包括宏定义命名的头文件maxmin:

#define max(a,b) (((a) > (b)) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)

看到此定义,预处理器将替换max表达式中的标识符:

std::numeric_limits<size_t>::max()
Run Code Online (Sandbox Code Playgroud)

通过宏定义,最终导致语法无效:

std::numeric_limits<size_t>::(((a) > (b)) ? (a) : (b))
Run Code Online (Sandbox Code Playgroud)

报告编译错误:'(' : illegal token on right side of '::'.

作为一种变通方法,您可以将NOMINMAXdefine 添加到编译器标志(或在包含标头之前添加到翻译单元):

#define NOMINMAX   
Run Code Online (Sandbox Code Playgroud)

或者max用括号括起调用,这会阻止宏扩展:

size_t maxValue_ = (std::numeric_limits<size_t>::max)()
//                 ^                                ^
Run Code Online (Sandbox Code Playgroud)

#undef max致电之前numeric_limits<size_t>::max():

#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()
Run Code Online (Sandbox Code Playgroud)

  • &lt;&lt; 或用括号括住对 max 的调用,这可以防止宏扩展: &gt;&gt; 对我来说非常有效,谢谢! (4认同)

bor*_*sbn 8

至于其他人说的问题是,在<WinDefs.h>(由包含<windows.h>)定义macroses minmax,但如果你会看到它的声明:

// <WinDefs.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 */
Run Code Online (Sandbox Code Playgroud)

你会看到,如果定义了一个宏,NOMINMAX那么WinDefs.h就不会生成这些宏.

这就是为什么最好NOMINMAX为项目添加一个定义.