'uint32_t' benennt keinen Typ

77

Ich versuche, ein C ++ - Softwarepaket zu kompilieren, das 2007 geschrieben wurde, und erhalte folgende Fehlermeldung:

error: ‘uint32_t’ does not name a type

Dies geschieht in 64-Bit-Ubuntu mit g ++ 4.5.2. Es wird unter 64-Bit-CentOS mit g ++ 4.1.2 problemlos kompiliert.

Gibt es ein #includeoder ein Compiler-Flag, das mir fehlt? Oder sollte ich verwenden typedef, um uint32_teinem size_toder vielleicht einem zuzuweisen unsigned int?

rmtheis
quelle
5
Suchen Sie nach den Headern stdint.h oder <cstdint>. Dieser Typ ist (so wie ich es verstehe) Teil von C99, hat es aber nicht in C ++ geschafft.
Mike C
3
Hast du #include <stdint.h>? Sieht aus wie ein möglicher Fehler unter 64-Bit-Ubuntu. Haben Sie auch eine -std=c++98oder eine solche Befehlszeilenoption für gcc? Wenn ja, können Sie überprüfen, ob es bei Verwendung einwandfrei kompiliert wird -std=gnu++98?
dirkgently
@dirkgently habe ich das Makefile überprüft und es gab keine stdOptionen.
rmtheis
@ user667810: Standardmäßig werden GNU-Erweiterungen und der C ++ 98-Modus verwendet.
Dirkgently

Antworten:

153

Sie müssen stdint.h einschließen

 #include <stdint.h>
Selbie
quelle
58
Der "richtige" C ++ - Header wäre cstdint.
Paxdiablo
1
Beachten Sie, dass in meinem Fall das Problem tatsächlich darin bestand, dass das Include boost/cstdint.hppnicht gefunden wurde. yum install boost-develhabe meinen Fall behoben.
Snooze92
@paxdiablo sollte die Datei cstdint.h nicht in einem externen "C" {} -Block enthalten sein?
StarShine
@paxdiablo der 'richtige' Header gab mir "#error Diese Datei erfordert Compiler- und Bibliotheksunterstützung für den ISO C ++ 2011-Standard. Diese Unterstützung ist derzeit experimentell ..." Ja, ja, sollte aktualisiert werden, aber es ist eine enorme alte App, die kaum hat es in die 64-Bit-Welt geschafft.
Brewmanz
Was ist Cmit GCC?
Royi
33

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

Das Problem ist, dass einige Compiler häufig automatisch Namen exportieren, die in verschiedenen Headern oder bereitgestellten Typen definiert sind, bevor solche Standards vorhanden waren.

Jetzt sagte ich "funktioniert möglicherweise 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 (dies ist jedoch häufig der Fall). 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- boost/cstdint.hppHeaders empfehlen , wenn Sie Boost verwenden möchten. Andernfalls werden Sie wahrscheinlich mit # include'ing davonkommen können <cstdint>.

Plasma
quelle
Dies gab mir#error This file requires compiler and library support for the upcoming ISO C++ standard, C++0x. This support is currently experimental, and must be enabled with the -std=c++0x or -std=gnu++0x compiler options.
rmtheis
1
Richtig, wie es heißt, ist cstdint Teil des neuen C ++ - Standards (der C ++ 0x hieß, aber offiziell nicht C ++ 11 ist. Um diesen Header zu verwenden, müssen Sie den neuen Standard in g ++ aktivieren Ich sagte, der beste tragbare Weg, um diese Typen zu erhalten, ist die Verwendung von Boost oder eines anderen gleichwertigen Headers, anstatt sich auf die Compiler-Unterstützung zu verlassen.
Plasma
9

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

patti_jane
quelle
6

Bei den anderen Antworten wird davon ausgegangen, 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 aufgenommen. 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 tragbar. Aber es könnte für Ihren Compiler funktionieren.

Daniel Lemire
quelle
Benötigt diese für Kernel Driver (C), es kompiliert! Danke
DreTaX
1

Fügen Sie Folgendes in die Datei base.mk ein. 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

Gowriganesh
quelle
1
Die Frage sagt nicht aus, ob Make verwendet wird. Eine tragbarere Antwort würde nur sagen, welche Flags an den Compiler übergeben werden sollen (und welchen Compiler Sie annehmen).
Toby Speight
1

wenn es passiert ist, wenn Sie den OpenCV-Header einschließen.

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

Platzieren Sie die opencv-Header direkt unter dem Standard-C ++ - Header.

so was:

#include<iostream>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
user3094631
quelle
Was hat das mit opencv zu tun? Dies ist ein sehr allgemeiner Fehler, der unter vielen Umständen auftritt.
EntangledLoops
1

Ich hatte das gleiche Problem beim Versuch, eine Bibliothek zu kompilieren, die ich aus dem Internet heruntergeladen habe. In meinem Fall war bereits ein #include <cstdint>im Code. Ich habe es gelöst und Folgendes hinzugefügt:

using std::uint32_t;
Daniel
quelle
1
@ Daniel Sie müssen noch #includeden richtigen Header verwenden, bevor Sie auf den Typ zugreifen können.
cbr
Ja, das #includewird benötigt. Ich habe nicht gesagt, dass es nicht ist. Aber da es in meinem Fall ein #include <cstdint>war und es keinen gab using namespace std, konnte der Compiler den Namen nicht auflösen uint32_t. Das ist der Grund, warum ich denusing std::uint32_t;
Daniel
0

Navigieren Sie einfach zu / usr / include / x86_64-linux-gnu / bits, öffnen Sie stdint-uintn.h und fügen Sie diese Zeilen hinzu

typedef __uint8_t uint8_t;
typedef __uint16_t uint16_t;
typedef __uint32_t uint32_t;
typedef __uint64_t uint64_t;

Öffnen Sie erneut stdint-intn.h und fügen Sie hinzu

typedef __int8_t int8_t;
typedef __int16_t int16_t;
typedef __int32_t int32_t;
typedef __int64_t int64_t;

Beachten Sie, dass diese Zeilen bereits vorhanden sind. Kopieren Sie einfach die fehlenden Zeilen und fügen Sie sie hinzu.

Rajnish Sharma
quelle
-2

Sie müssen iostream einschließen

#include <iostream>
using namespace std;
SamiraMiss
quelle