2015-05-27 4 views
11

Ich arbeite an einer bestehenden C++ - Codebase, die an mehreren Stellen SIZE_MAX verwendet. Ich habe etwas refactoring gemacht und jetzt SIZE_MAX ist nicht in einem der Module definiert. Dieses Problem trat auf, als Travis-CI versucht wurde, das Projekt unter Linux zu erstellen. Es funktionierte gut, bevor ich Sachen umstrukturierte, aber zu verfolgen, welche genauen Header-Dateien enthalten waren, ist schwierig.Welcher C++ - Standard-Header definiert SIZE_MAX?

In einem Versuch, das Problem lokal zu replizieren, habe ich eine Ubuntu VM mit dem Standard-GCC installiert und konnte es reproduzieren. Hier ist die relevante Quelle:

#include <stddef.h> 

int main() 
{ 
    size_t a = SIZE_MAX; 
} 

Die Kommandozeile ist einfach:

g++ a.cpp 

Der Fehler ist:

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

Systeminfo:

$ 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 

Ich habe versucht, einschließlich cstdint, stdint.h, inttypes.h, stdio.h, stdlib.h, und wahrscheinlich einige andere, und ich kann nicht herausfinden, welche spezifische Header-Datei ich für SIZE_MAX brauche.

Es ist wichtig zu beachten, dass das Programm, das ich arbeite kompiliert gut, mit SIZE_MAX an verschiedenen Orten verwendet, bevor ich einige Änderungen vorgenommen habe. Die Änderungen, die ich vorgenommen habe, führten dazu, dass es in eine.cpp Quelldatei, in der es verwendet wurde, undefiniert wird (die anderen sind weiterhin in Ordnung). So gibt es einige Header-Datei auf meinem System, wo es richtig definiert ist.

+0

Haben Sie versucht 'cstdint' ... Abschnitt * [cstdint.syn] * sagt, es sollte da sein, aber es sollte auch in' stdint.h' sein. –

+1

@ShafikYaghmour: Ich habe, und der Compiler warnt mich, dass die Einbeziehung dieser Header erfordert die '-std = C++ 0x 'wechseln, aber das ist kein C++ 11 Programm, und ich möchte das nicht ändern. Es findet immer noch nicht "SIZE_MAX", wenn "cstdint" trotzdem eingefügt wird. –

+0

Sehen Sie sich dieses https://groups.google.com/forum/#!msg/snap-discuss/giu_IMZndxI/CYP98BGvf7QJ – Santhucool

Antwort

8

Es ist wahrscheinlich, dass einige Header __STDC_LIMIT_MACROS und __STDC_CONSTANT_MACROS vor stdint.h enthalten waren.

Kompilieren unter Linux mit g++ -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS a.cpp sollte dieses Problem auf den älteren Compilern beheben.

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

+0

Huh, das hat funktioniert!Zumindest auf meinem System für das Testprogramm. Ich werde es mit dem richtigen Programm auf Travis-CI versuchen. –

+1

Das hat tatsächlich funktioniert. Ich habe '#define __STDC_LIMIT_MACROS' vor dem ersten Include in der Problemquelldatei hinzugefügt und dann erfolgreich kompiliert. –

7

18.4.1 Kopf < cstdint> Übersicht

Der Header auch zahlreiche Makros des Formulars definiert:

int_ [FAST MINDESTENS] {8 16 32 64} _min

[U] INT_ [SCHNELLER LEER] {8 16 32 64} _MAX

INT {MAX PTR} _MIN

[U] INT {MAX PTR} _max

{PTRDIFF SIG_ATOMIC WCHAR WINT} {_ MAX _min}

SIZE_MAX

EDIT

In der aktuelle C++ 11/14 Standard, SIZE_MAX, ist eingeführt und von Männern nur in <cstdint>. Es ist auch Teil von C99, dessen Spezifikation C++ 11 vollständig über die <cxxx> Header umfasst. Es scheint also, dass es nicht vor C++ 11 definiert wurde.

+1

@GregHewgill leider habe ich keine Kopie des C++ 98/03-Standards. Ich bin mir nicht einmal sicher, ob es vorher definiert wurde. Ich denke, es ist durch den C99-Standard definiert, und afaik, C++ 11 enthält vollständig C99-Spezifikationen. – vsoftco

+0

@vsoftco: C++ 2003 enthielt 'cstdint' nicht und daher nicht' SIZE_MAX'. –

+0

@BillLynch Ja das ist, was ich im Grunde gesagt habe, dass es scheint, in C++ 11 neu eingeführt zu werden (obwohl es vorher ein Teil von C99 war). – vsoftco

1

Welche C++ Standard-Header definiert SIZE_MAX?

Es soll in <cstdint> definiert werden, aber es ist optional.

Hier sind die Ergebnisse auf Fedora 22 mit GCC 5.1:

#include <cstdint> 

// use SIZE_MAX 

Ergebnisse in:

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 
            ^

Es war einfach leichter folgendes zu tun, und über nicht-portable optional- aufhören, sich Sorgen ness, die noch Probleme verursacht in 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 

Versuch __SIZE_MAX__ ge bringt Sie zurück zur Kompilierzeitkonstante, nach der Sie sich wahrscheinlich sehnen. Sie können sehen, ob es im Präprozessor mit cpp -dM < /dev/null | grep __SIZE_MAX__ definiert ist.

(Und wie/warum numeric_limits<size_t>::max()nicht eine Kompilierung konstant ist, ist eine andere C++ Rätsel, aber das ist ein anderes Problem).

+0

"' numeric_limits :: max() 'ist keine Kompilierzeitkonstante" - mit welchem ​​Standard? http://en.cppreference.com/w/cpp/types/numeric_limits/max sagt, es ist constexpr seit C++ 11 (Danke für Hinweis an Benutzer 1913600 - Romain-b). – osgx

Verwandte Themen