Erreur d'identifiant 'uint32_t' introuvable

94

Je porte du code de Linux C vers Visual C ++ pour Windows.

Visual C ++ ne le sait pas, #include <stdint.h>alors je l'ai commenté.

Plus tard, j'ai trouvé beaucoup de ces 'uint32_t': identifier not founderreurs. Comment peut-il être résolu?

Kevin
la source
Quelle inclusion commentez-vous?
Daniel A. White
3
Et quelle (s) version (s) de Visual C ++ utilisez-vous? Le uint32_tet les autres types d'entiers de largeur exacte ne font partie que de C99 et C ++ 0x, donc les compilateurs plus anciens (comme Visual C ++ 2008 et versions antérieures) ne les ont pas.
James McNellis
Beaucoup !!! #include <stdint.h> #include <syslog.h> #include <linux / stddef.h> #include <pthread.h> #include <unistd.h> Merci !!!
kevin
J'utilise Visual C ++ express 2008.
kevin
4
@kevin: Vous ne pouvez pas simplement supprimer les en-têtes spécifiques à la plate-forme et les oublier. Vous devez trouver des alternatives pour la nouvelle plateforme. Cela implique souvent une certaine réécriture de votre code afin de le rendre portable.
Courses de légèreté en orbite

Réponses:

114

Ce type est défini dans l'en-tête C <stdint.h>qui fait partie du standard C ++ 11 mais pas du standard C ++ 03. Selon la page Wikipedia sur l'en-tête , il n'a été livré avec Visual Studio avant VS2010.

En attendant, vous pourriez probablement simuler votre propre version de l'en-tête en ajoutant des typedefs qui mappent les types d'entiers personnalisés de Microsoft aux types attendus par C. Par exemple:

typedef __int32 int32_t;
typedef unsigned __int32 uint32_t;
/* ... etc. ... */

J'espère que cela t'aides!

templatetypedef
la source
4
Vous pouvez également utiliser l'implémentation cstdint de Boost.
Peter Huene
Je copie et colle votre code sur ma page. Mais il montre cette erreur "erreur de syntaxe: manquant ';' avant l'identificateur 'int32_t' "et" spécificateur de type manquant - int supposé. Remarque: C ++ ne prend pas en charge default-int ".
kevin
Désolé Peter, je suis nouveau dans C. Quelle est l'implémentation cstdint de Boost?
kevin
3
Les types d'entiers de taille fixe de Microsoft ne se terminent pas par "t". Essayez juste __int32.
Ben Voigt
1
u_int32_tet uint32_tne sont pas du même type; on a un trait de soulignement supplémentaire après le u. Cela semble être un problème distinct.
templatetypedef
78

Vous pouvez #include <cstdint>. Cela fait partie du C ++ - standard depuis 2011.

Tigerle
la source
1
Cela devrait probablement être la réponse acceptée étant donné les contraintes de la question, comme C ++ et VS2010. Il n'est pas nécessaire de rouler vos propres typedef.
jww
7

J'ai la même erreur et je l'ai corrigée en incluant dans le fichier ce qui suit

#include <stdint.h>

au début de votre dossier.

Nacho Barreto
la source
Comme indiqué dans la question, stdint.h ne fait pas partie du compilateur C ++ que l'OP utilise. Cette réponse ne répond pas à la question.
IInspectable le
7

Boost . Config propose ces typedefs pour les jeux d'outils qui ne les fournissent pas nativement. La documentation de cette fonctionnalité spécifique est ici: Types d'entiers standard

ildjarn
la source
3

Une implémentation est disponible sur la page du projet msinttypes - «Ce projet remplit l'absence de stdint.h et inttypes.h dans Microsoft Visual Studio».

Je n'ai pas d'expérience avec cette implémentation, mais je l'ai vue recommandée par d'autres sur SO.

Brandon Leiran
la source
C'est la meilleure implémentation et la plus couramment utilisée.
Philippe Ombredanne
0

J'ai dû exécuter le projet dans VS2010 et je n'ai pas pu introduire de modifications dans le code. Ma solution consistait à installer vS2013 et dans VS2010, les répertoires VC ++ -> IncludeDirectories to Program Files (x86) \ Microsoft Visual Studio 12.0 \ VC \ include. Ensuite, mon projet a été compilé sans aucun problème.

Darqer
la source