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

Gre*_*ill 16 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;
}
Run Code Online (Sandbox Code Playgroud)

命令行很简单:

g++ a.cpp
Run Code Online (Sandbox Code Playgroud)

错误是:

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

系统信息:

$ 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
Run Code Online (Sandbox Code Playgroud)

我曾尝试包括cstdint,stdint.h,limits.h,inttypes.h,stdio.h,stdlib.h,,可能有一些人,我想不出我需要哪些特定的头文件SIZE_MAX.

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

Bil*_*nch 14

可能包含了一些已定义的标头__STDC_LIMIT_MACROS__STDC_CONSTANT_MACROS之前的标头stdint.h.

在Linux上进行编译g++ -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS a.cpp应该可以在较旧的编译器上修复此问题.

如果您想了解有关这些宏的更多信息......

  • 确实有效.我在问题源文件中的第一个包含之前添加了`#define __STDC_LIMIT_MACROS`,然后编译成功. (2认同)

vso*_*tco 10

18.4.1标题<cstdint>概要

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

INT_ [最快] {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>.它也是C99C++ 11规范通过<cxxx>标题完全包含的一部分.所以它似乎没有在C++ 11之前定义.

  • @GregHewgill遗憾的是我没有C++ 98/03标准的副本.我甚至不确定它是否已经定义过.我认为它是由C99标准定义的,而afaik,C++ 11完全包含C99规范. (2认同)