Вероятно, что некоторые заголовки определены __STDC_LIMIT_MACROS
и __STDC_CONSTANT_MACROS
до stdint.h
.
Компиляция в Linux с g++ -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS a.cpp
должна исправить эту проблему на старых компиляторах.
Какой стандартный заголовок C ++ определяет SIZE_MAX?
blockquote>Предполагается, что он определен в
<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()
является not , константа времени компиляции является еще одной загадкой C ++, но это другая проблема).
numeric_limits<size_t>::max()
не является постоянной времени компиляции" - с каким стандартом? ru.cppreference.com/w/cpp/types/numeric_limits/max говорит, что это constexpr с C ++ 11 (спасибо за подсказку для пользователя 1913600 - romain-b).
– osgx
1 August 2017 в 23:36
18.4.1 Header & lt; cstdint> synopsis
Заголовок также определяет многочисленные макросы формы:
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
blockquote> blockquote>EDIT
В текущем стандарте C ++ 11/14
SIZE_MAX
вводится и упоминается только в<cstdint>
. Он также является частьюC99
, из которых спецификация C ++ 11 полностью включает в себя заголовки<cxxx>
. Так кажется, что он не был определен до C ++ 11.
cstdint
и поэтому не включал SIZE_MAX
.
– Bill Lynch
27 May 2015 в 03:46
#define __STDC_LIMIT_MACROS
перед первым включением в исходный файл проблемы, а затем скомпилирован. – Greg Hewgill 27 May 2015 в 04:09