web-dev-qa-db-fra.com

'uint32_t' ne nomme pas un type

J'essaie de compiler un package logiciel C++ écrit en 2007 et j'obtiens cette erreur:

error: ‘uint32_t’ does not name a type

Cela se produit dans Ubuntu 64 bits en utilisant g ++ 4.5.2. Il compile bien sur CentOS 64 bits en utilisant g ++ 4.1.2.

Y'a-t-il un #include ou un indicateur de compilateur qui me manque? Ou devrais-je utiliser typedef pour affecter uint32_t à un size_t ou peut-être un unsigned int?

64
rmtheis

Vous devez inclure stdint.h

 #include <stdint.h>
127
selbie

Tu dois #include <cstdint>, mais cela ne fonctionne pas toujours.

Le problème est que certains compilateurs exportent souvent automatiquement les noms définis dans divers en-têtes ou types fournis avant la mise en place de telles normes.

Maintenant, j'ai dit "peut ne pas toujours fonctionner." En effet, l'en-tête cstdint fait partie de la norme C++ 11 et n'est pas toujours disponible sur les compilateurs C++ actuels (mais l'est souvent). L'en-tête stdint.h est l'équivalent C et fait partie de C99.

Pour une meilleure portabilité, je vous recommande d'utiliser boost/cstdint.hpp en-tête, si vous êtes prêt à utiliser boost. Sinon, vous pourrez probablement vous échapper avec # include'ing <cstdint>.

31
plasma

J'ai également rencontré le même problème sur Mac OSX 10.6.8 et malheureusement en ajoutant #include <stdint.h> ou <cstdint.h> au fichier correspondant n'a pas résolu mon problème. Cependant, après plus de recherches, j'ai trouvé cette solution conseillant d'ajouter #include <sys/types.h> qui a bien fonctionné pour moi!

9
patti_jane

Les autres réponses supposent que votre compilateur est conforme à C++ 11. C'est bien si c'est le cas. Mais que se passe-t-il si vous utilisez un compilateur plus ancien?

J'ai ramassé le hack suivant quelque part sur le net. Cela fonctionne assez bien pour moi:

  #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

Ce n'est pas portable, bien sûr. Mais cela pourrait fonctionner pour votre compilateur.

5
Daniel Lemire

Ajoutez ce qui suit dans le fichier base.mk. La 3ème ligne suivante est importante -include $(TOP)/defs.mk

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

pour éviter l'erreur # Ce fichier nécessite la prise en charge du compilateur et de la bibliothèque pour la prochaine norme ISO C++, C++ 0x. Cette prise en charge est actuellement expérimentale et doit être activée avec les options du compilateur -std = c ++ 0x ou -std = gnu ++ 0x

1
gowriganesh

J'ai eu le même problème en essayant de compiler une bibliothèque que je télécharge sur Internet. Dans mon cas, il y avait déjà un #include <cstdint> dans le code. Je l'ai résolu en ajoutant un:

using std::uint32_t;
1
Daniel

si cela se produit lorsque vous incluez en-tête opencv.

Je recommanderais de changer l'ordre des en-têtes.

placez les en-têtes d'opencv juste en dessous de l'en-tête C++ standard.

comme ça:

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