Pourquoi ne pas PRIu64 travail dans ce code?
Comme par cette réponse, j'ai essayé de l'impression d'un uint64_t
, mais il me donne une erreur:
erreur: expected `)' avant 'PRIu64'
Suivant est le minimum de code montrant ce que je suis en train de faire:
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
#include <cstdio>
class X {
X() {
uint64_t foo = 0;
printf("%07" PRIu64 ": ", foo);
}
};
int main() {}
Ce code minimal compile, mais mon code ne fonctionne pas. Cependant, j'ai essayé avec les 2 lignes à l'intérieur de X::X()
exactement la même chose dans mon code, et qui ne fonctionne pas.
Que dois-je regarder pour déboguer cette plus loin? Mon code aussi #include
s d'autres en-têtes. Peut-être l'origine du problème? N'afin d'inclure les en-têtes de la matière?
Modifier
PRIu64
est définie comme suit sur ma machine:
# if __WORDSIZE == 64
# define __PRI64_PREFIX "l"
# define __PRIPTR_PREFIX "l"
# else
# define __PRI64_PREFIX "ll"
# define __PRIPTR_PREFIX
# endif
# define PRIu64 __PRI64_PREFIX "u"
- Pourquoi êtes-vous à l'aide de printf en C++? En outre, nous ne pouvons pas le code de débogage, nous ne pouvons pas voir... les erreurs Communes sont manquantes ; ou ).
- Pouvez-vous vérifier ce qu'est exactement
PRIu64
est défini comme? - Je ne sais
cout
. 🙂 Il est plus lent queprintf
sur mon système, donc je préfère utiliser que dans les cas oùprintf
n'est pas assez bon. Je sais que vous ne pouvez pas le code de débogage, vous ne pouvez pas voir. Je suis l'espoir d'obtenir quelques idées sur ce qui pourrait être mauvais, de sorte que j'ai pu essayer le débogage plus loin. - Ajouter la ligne qui vous donne l'erreur, car votre exemple minimal compile.
- Édité question. Cela me donne quelques idées sur la façon de déboguer plus loin. Merci.
- Dans mon code, j'ai essayé avec exactement les mêmes 2 lignes. Malheureusement, je ne peux pas partager le code.
- Collin réponse devrait être accepté: il très bien correspondre à la réalité que votre exemple minimal fonctionne, mais pas votre code.
- vous avez raison, je n'ai que maintenant. J'ai quitté ce job il y a quelques années, donc n'oubliez pas non plus que le problème d'origine a été, mais néanmoins, la réponse décrit clairement le problème.
Vous devez vous connecter pour publier un commentaire.
Une autre possibilité pour cette question je viens de trouver dans mon propre code est si un autre en-tête de déjà tire dans
<inttypes.h>
avant vous définissez__STDC_FORMAT_MACROS
. Par exemple:Utils.h (peut-être à l'origine écrit pour le C, comme c'était notre cas):
MyFile.cpp:
Depuis
inttypes.h
a déjà été inclus parUtil.h
, le compilateur ne comprend pas encore, et ne pas voir la déclaration de__STDC_FORMAT_MACROS
.La solution est soit de modifier
Utils.h
inclure#define __STDC_FORMAT_MACROS
, ou assurez-vous de le définir avant de faire l'inclut dansMyFile.cpp
.La configuration d'origine en fait compilés juste fine sur GCC 4.8 sur Ubuntu, mais a échoué avec un vieux cadre du GCC 4.3 chaîne de compilation pour processeurs PowerPC, ce qui rend d'autant plus compliqué au premier abord.
En C++, les macros ne sont pas automatiquement défini en incluant le fichier.
Vous devez ajouter les éléments suivants:
avant
Comment printf un uint64_t? Échoue avec: "fallacieux de fuite" % "dans le format"
PRIu64
n'est pas définie lorsque vous l'utilisez.La remplacer par la chaîne
"llu"
et votre code compiler (mais ce n'est pas une solution, il démontre simplement le problème)Peut-être le
include
est manquant. Peut-être plus de zealos inclure des gardes et qu'il soit inclus sans la magie jeton de bloquer ladefine
. Peut-être que votre pch est en panne.#include
directive exactement comme ci-dessus. J'ai copié le#define
s de lainttypes.h
et puis il travaille. Quelle serait la cause d'un en-tête non inclus? Il n'y a pas de garde états autour de la#include
.Si vous êtes sur android JNI plate-forme. Mettez ceci dans votre Android.mk: