webentwicklung-frage-antwort-db.com.de

'uint32_t' nennt keinen Typ

Ich versuche, ein C++ - Softwarepaket zu kompilieren, das 2007 geschrieben wurde, und erhalte den folgenden Fehler:

error: ‘uint32_t’ does not name a type

Dies geschieht in 64-Bit-Ubuntu unter Verwendung von g ++ 4.5.2. Es kann unter 64-Bit-CentOS mit g ++ 4.1.2 problemlos kompiliert werden.

Gibt es ein #include Oder ein Compiler-Flag, das mir fehlt? Oder sollte ich typedef verwenden, um uint32_t Einem size_t Oder vielleicht einem unsigned int Zuzuweisen?

64
rmtheis

Sie müssen stdint.h einschließen

 #include <stdint.h>
127
selbie

Sie müssen #include <cstdint> Eingeben, aber das funktioniert möglicherweise nicht immer.

Das Problem ist, dass einige Compiler Namen, die in verschiedenen Headern oder bereitgestellten Typen definiert wurden, oft automatisch exportieren, bevor solche Standards eingeführt wurden.

Jetzt sagte ich "funktioniert vielleicht nicht immer." Dies liegt daran, dass der cstdint-Header Teil des C++ 11-Standards ist und auf aktuellen C++ - Compilern nicht immer verfügbar ist (was jedoch häufig der Fall ist). Der Header stdint.h ist das C-Äquivalent und Teil von C99.

Für eine optimale Portabilität würde ich die Verwendung des Boost-Headers boost/cstdint.hpp Empfehlen, wenn Sie Boost verwenden möchten. Andernfalls können Sie wahrscheinlich mit # include'ing <cstdint> Durchkommen.

31
plasma

Ich habe das gleiche Problem auch unter Mac OS X 10.6.8 und leider beim Hinzufügen von #include <stdint.h> oder <cstdint.h> zur entsprechenden Datei hat mein Problem nicht gelöst. Nach mehr Suche fand ich diese Lösung jedoch empfehlenswert, #include <sys/types.h> was für mich gut funktioniert hat!

9
patti_jane

Die anderen Antworten setzen voraus, dass Ihr Compiler C++ 11-kompatibel ist. Das ist in Ordnung, wenn es so ist. Aber was ist, wenn Sie einen älteren Compiler verwenden?

Ich habe den folgenden Hack irgendwo im Netz gefunden. Es funktioniert gut genug für mich:

  #if defined __UINT32_MAX__ or UINT32_MAX
  #include <inttypes.h>
  #else
  typedef unsigned char uint8_t;
  typedef unsigned short uint16_t;
  typedef unsigned long uint32_t;
  typedef unsigned long long uint64_t;
  #endif

Es ist natürlich nicht portabel. Aber es könnte für Ihren Compiler funktionieren.

5
Daniel Lemire

Fügen Sie der Datei base.mk Folgendes hinzu. Die folgende 3. Zeile ist wichtig -include $(TOP)/defs.mk

CFLAGS=$(DEBUG) -Wall -W -Wwrite-strings 
CFLAGS_C=-Wmissing-prototypes
CFLAGS_CXX=-std=c++0x
LDFLAGS=
LIBS=

um den # Fehler zu vermeiden Diese Datei erfordert Compiler- und Bibliotheksunterstützung für den kommenden ISO C++ - Standard C++ 0x. Diese Unterstützung ist derzeit experimentell und muss mit den Compileroptionen -std = c ++ 0x oder -std = gnu ++ 0x aktiviert werden

1
gowriganesh

Ich hatte das gleiche Problem beim Kompilieren einer Bibliothek, die ich aus dem Internet heruntergeladen habe. In meinem Fall gab es bereits ein #include <cstdint> im Code. Ich habe es gelöst, indem ich Folgendes hinzugefügt habe:

using std::uint32_t;
1
Daniel

wenn es passiert ist, wenn Sie opencv-Header enthalten.

Ich würde empfehlen, die Reihenfolge der Überschriften zu ändern.

setzen Sie die opencv-Header direkt unter den Standard-C++ - Header.

so was:

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
1
user3094631