【问题标题】:Which C++ standard header defines SIZE_MAX?哪个 C++ 标准头文件定义了 SIZE_MAX?
【发布时间】:2015-05-27 03:38:21
【问题描述】:

我正在开发一个现有的 C++ 代码库,该代码库恰好在几个地方使用了SIZE_MAX。我做了一些重构,现在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 已在各个地方使用。我所做的更改导致它在 one .cpp 使用它的源文件中变得未定义(其他人继续没问题)。所以在我的系统上存在正确定义的 some 头文件。

【问题讨论】:

  • 你试过cstdint ...部分[cstdint.syn]说它应该在那里,但它也应该在stdint.h中。
  • @ShafikYaghmour:我有,编译器警告我包含该标头需要-std=c++0x 开关,但这不是 C++11 程序,我不想更改它.无论如何,当包含cstdint 时,它仍然无法找到SIZE_MAX
  • @iammilind:我已经阅读了这个问题。它不是重复的。这个问题是理解SIZE_MAX 的含义,而我的问题与我需要包含哪个头文件有关。
  • @Santhucool:这很有趣,但似乎特定于我不熟悉的一个名为 SNAP 的软件包,而且我不清楚如何修复我的程序。

标签: c++ header size-t stdint


【解决方案1】:

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

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

If you'd like to learn more about these macros...

【讨论】:

    【解决方案2】:

    18.4.1 标题 概要

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

    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 被引入并仅在&lt;cstdint&gt; 中提及。它也是C99 的一部分,其中规范C++11 通过&lt;cxxx&gt; 标头完全包含。所以它似乎在 C++11 之前没有定义。

    【讨论】:

    • @GregHewgill 不幸的是,我没有 C++98/03 标准的副本。我什至不确定它是以前定义的。我认为它是由 C99 标准定义的,而且 afaik,C++11 完全包含 C99 规范。
    • @vsoftco:C++ 2003 不包括 cstdint,因此不包括 SIZE_MAX
    • @BillLynch 是的,我基本上是这么说的,它似乎是在 C++11 中新引入的(尽管它之前是 C99 的一部分)。
    • C++03 没有使用 C99 作为规范参考。
    • @ShafikYaghmour 谢谢,我编辑了答案,我也知道 C++11 是第一个完全整合 C99 的版本。
    【解决方案3】:

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

    它应该在&lt;cstdint&gt;中定义,但它是可选的。

    以下是使用 GCC 5.1 的 Fedora 22 上的结果:

    #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 &lt; /dev/null | grep __SIZE_MAX__ 查看它是否在预处理器中定义。

    (以及为什么/为什么numeric_limits&lt;size_t&gt;::max()不是编译时间常数是另一个 C++ 谜团,但这是另一个问题。

    【讨论】:

    • "numeric_limits&lt;size_t&gt;::max() 不是编译时间常数" - 使用哪个标准? en.cppreference.com/w/cpp/types/numeric_limits/max 表示自 C++11 以来它是 constexpr(感谢用户 1913600 - romain-b 的提示)。
    • 替代定义是#define SIZE_MAX (static_cast&lt;size_t&gt;(-1)),而不是使用numeric_limits
    猜你喜欢
    • 2011-05-28
    • 2023-02-10
    • 2011-07-19
    • 1970-01-01
    • 2013-10-07
    • 2014-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多