哪个C ++标准头定义了SIZE_MAX?

时间:2015-05-27 03:38:21

标签: c++ header size-t stdint

我正在处理在几个地方碰巧使用SIZE_MAX的现有C ++代码库。我做了一些重构,现在SIZE_MAX没有在其中一个模块中定义。当Travis-CI尝试在Linux上构建项目时出现此问题。在重构之前它工作正常,但是跟踪包含哪些精确的头文件很困难。

为了尝试在本地复制问题,我安装了一个带有默认gcc的Ubuntu VM,并且能够重现它。以下是相关来源:

#include <stddef.h>

int main()
{
    size_t a = SIZE_MAX;
}

命令行只是:

g++ a.cpp

错误是:

a.cpp: In function ‘int main()’:
a.cpp:5:16: error: ‘SIZE_MAX’ was not declared in this scope

系统信息:

$ uname -a
Linux quartz 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:39:31 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
$ gcc --version
gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

我尝试过包括cstdintstdint.hlimits.hinttypes.hstdio.hstdlib.h,以及其他一些人,我无法确定SIZE_MAX所需的特定头文件。

重要的是要注意,在我做了一些更改之前,我正在处理编译好的程序,SIZE_MAX在各个地方使用。我所做的更改导致它在使用它的一个 .cpp源文件中未定义(其他的继续正常)。所以在我的系统上存在一些头文件,它正确定义。

3 个答案:

答案 0 :(得分:14)

可能会在__STDC_LIMIT_MACROS之前定义一些标头__STDC_CONSTANT_MACROSstdint.h

使用g++ -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS a.cpp在Linux上进行编译应该可以解决旧编译器上的这个问题。

Debugging "Element is not clickable at point" error

答案 1 :(得分:10)

18.4.1标题&lt; cstdint&gt;概要

  

标题还定义了许多形式的宏:

     
    

INT_ [FAST LEAST] {8 16 32 64} _MIN

         

[U] INT_ [FAST LEAST] {8 16 32 64} _MAX

         

INT {MAX PTR} _MIN

         

[U] INT {MAX PTR} _MAX

         

{PTRDIFF SIG_ATOMIC WCHAR WINT} {_ MAX _MIN}

         

<强> SIZE_MAX

  

修改

在当前的C ++ 11/14标准中,SIZE_MAX仅在<cstdint>中引入和提及。它也是C99的一部分,其中规范C ++ 11完全包含<cxxx>标题。所以它似乎没有在C ++ 11之前定义。

答案 2 :(得分:2)

  

哪个C ++标准头定义了SIZE_MAX?

它应该在<cstdint>中定义,但它是可选的。

以下是Fedora 22与GCC 5.1的结果:

#include <cstdint>

// use SIZE_MAX

结果:

g++ -DNDEBUG -g -O2 -fPIC -march=native -pipe -c filters.cpp
In file included from /usr/include/c++/5.1.1/cstdint:35:0,
                 from filters.cpp:14:
/usr/include/c++/5.1.1/bits/c++0x_warning.h:32:2: error: #error This file requires  
compiler and library support for the ISO C++ 2011 standard. This support is currently
experimental, and must be enabled with the -std=c++11 or -std=gnu++11 compiler options.
 #error This file requires compiler and library support for the \
  ^
filters.cpp: In constructor ‘Filter::Filter(BufferedTransformation*)’:
filters.cpp:305:36: error: ‘SIZE_MAX’ was not declared in this scope
  : Filter(attachment), m_firstSize(SIZE_MAX), m_blockSize(0), m_lastSize(SIZE_M
                                    ^

执行以下操作变得更加容易,并且不再担心在2015年仍然会导致问题的非便携式可选项。

#include <limits>

#ifndef SIZE_MAX
# ifdef __SIZE_MAX__
#  define SIZE_MAX __SIZE_MAX__
# else
#  define SIZE_MAX std::numeric_limits<size_t>::max()
# endif
#endif

尝试__SIZE_MAX__会让你回到你可能渴望的编译时常量。您可以看到它是否在预处理器中使用cpp -dM < /dev/null | grep __SIZE_MAX__定义。

(以及numeric_limits<size_t>::max() 编译时常量是另一个C ++之谜,但这是一个不同的问题。)