哪个 C++ 标准头文件定义了 SIZE_MAX?
Which C++ standard header defines SIZE_MAX?
我正在处理一个现有的 C++ 代码库,它恰好在几个地方使用了 SIZE_MAX
。我做了一些重构,现在 SIZE_MAX
没有在其中一个模块中定义。当 Travis-CI 试图在 Linux 上构建项目时出现此问题。在我重构东西之前它工作得很好,但是跟踪包含哪些确切的头文件很困难。
为了尝试在本地复制问题,我安装了一个 Ubuntu VM 和默认的 gcc,并且能够重现它。这是相关来源:
#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
我试过包括 cstdint
、stdint.h
、limits.h
、inttypes.h
、stdio.h
、stdlib.h
,可能还有其他一些,我不知道 SIZE_MAX
.
需要哪个特定的头文件
重要的是要注意,在我进行一些更改之前,我正在编写的程序编译良好,SIZE_MAX
在各个地方使用。我所做的更改导致它在使用它的 one .cpp
源文件中变得未定义(其他的继续正常)。所以在我的系统上存在正确定义的 some 头文件。
18.4.1 Header 概要
The header also defines numerous macros of the form:
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>
headers 完全包含其中。所以它似乎没有在 C++11 之前定义。
很可能有些 header 在包含 stdint.h
之前定义了 __STDC_LIMIT_MACROS
和 __STDC_CONSTANT_MACROS
。
使用 g++ -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS a.cpp
在 Linux 上编译应该可以解决旧编译器上的这个问题。
Which C++ standard header defines 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__
.
查看它是否在预处理器中定义
(how/why numeric_limits<size_t>::max()
是 而不是 编译时间常量是另一个 C++ 之谜,但那是一个不同的问题)。
我正在处理一个现有的 C++ 代码库,它恰好在几个地方使用了 SIZE_MAX
。我做了一些重构,现在 SIZE_MAX
没有在其中一个模块中定义。当 Travis-CI 试图在 Linux 上构建项目时出现此问题。在我重构东西之前它工作得很好,但是跟踪包含哪些确切的头文件很困难。
为了尝试在本地复制问题,我安装了一个 Ubuntu VM 和默认的 gcc,并且能够重现它。这是相关来源:
#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
我试过包括 cstdint
、stdint.h
、limits.h
、inttypes.h
、stdio.h
、stdlib.h
,可能还有其他一些,我不知道 SIZE_MAX
.
重要的是要注意,在我进行一些更改之前,我正在编写的程序编译良好,SIZE_MAX
在各个地方使用。我所做的更改导致它在使用它的 one .cpp
源文件中变得未定义(其他的继续正常)。所以在我的系统上存在正确定义的 some 头文件。
18.4.1 Header
The header also defines numerous macros of the form:
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>
headers 完全包含其中。所以它似乎没有在 C++11 之前定义。
很可能有些 header 在包含 stdint.h
之前定义了 __STDC_LIMIT_MACROS
和 __STDC_CONSTANT_MACROS
。
使用 g++ -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS a.cpp
在 Linux 上编译应该可以解决旧编译器上的这个问题。
Which C++ standard header defines 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__
.
(how/why numeric_limits<size_t>::max()
是 而不是 编译时间常量是另一个 C++ 之谜,但那是一个不同的问题)。