web-dev-qa-db-fra.com

Quel en-tête standard C ++ définit SIZE_MAX?

Je travaille sur une base de code C++ existante qui utilise SIZE_MAX à quelques endroits. J'ai fait du refactoring et maintenant SIZE_MAX n'est pas défini dans l'un des modules. Ce problème est apparu lorsque Travis-CI a tenté de générer le projet sous Linux. Cela a bien fonctionné avant de refactoriser des trucs, mais il est difficile de déterminer quels fichiers d'en-tête exacts étaient inclus.

Dans une tentative de répliquer le problème localement, j'ai installé un Ubuntu VM avec le gcc par défaut et j'ai pu le reproduire. Voici la source pertinente:

#include <stddef.h>

int main()
{
    size_t a = SIZE_MAX;
}

La ligne de commande est simplement:

g++ a.cpp

L'erreur est:

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

Information système:

$ 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

J'ai essayé d'inclure cstdint, stdint.h, limits.h, inttypes.h, stdio.h, stdlib.h, et probablement d'autres, et je ne peux pas déterminer de quel fichier d'en-tête spécifique j'ai besoin pour SIZE_MAX.

Il est important de noter que le programme sur lequel je travaille est bien compilé, avec SIZE_MAX utilisé à divers endroits, avant de faire quelques changements. Les modifications que j'ai apportées l'ont rendu indéfini dans un .cpp fichier source où il a été utilisé (les autres continuent à fonctionner). Il existe donc un fichier d'en-tête sur mon système où il est correctement défini.

17
Greg Hewgill

Il est probable qu'un en-tête défini __STDC_LIMIT_MACROS et __STDC_CONSTANT_MACROS avant stdint.h etait inclut.

Compilation sous Linux avec g++ -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS a.cpp devrait résoudre ce problème sur les anciens compilateurs.

Si vous souhaitez en savoir plus sur ces macros ...

16
Bill Lynch

18.4.1 Synopsis de l'en-tête <cstdint>

L'en-tête définit également de nombreuses macros du formulaire:

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

MODIFIER

Dans la norme C++ 11/14 actuelle, SIZE_MAX est introduit et mentionné uniquement dans <cstdint>. Il fait également partie de C99, dont la spécification C++ 11 inclut entièrement via le <cxxx> en-têtes. Il semble donc qu'il n'ait pas été défini avant C++ 11.

10
vsoftco

Quel en-tête standard C++ définit SIZE_MAX?

Son censé être défini dans <cstdint>, Mais son facultatif.

Voici les résultats sur Fedora 22 avec GCC 5.1:

#include <cstdint>

// use SIZE_MAX

Résulte en:

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
                                    ^

Il était tout simplement plus facile de faire ce qui suit, et de cesser de s'inquiéter des options non portables qui causent toujours des problèmes en 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

Essayer __SIZE_MAX__ Vous ramène à la constante de temps de compilation dont vous rêvez probablement. Vous pouvez voir s'il est défini dans le préprocesseur avec cpp -dM < /dev/null | grep __SIZE_MAX__.

(Et comment/pourquoi numeric_limits<size_t>::max() est pas une constante de temps de compilation est un autre mystère C++, mais c'est un problème différent).

2
jww