Selon cette réponse , j’ai essayé d’imprimer un uint64_t
, mais cela me donne une erreur:
erreur: attendu ``) 'avant' PRIu64 '
Voici le code minimal montrant ce que j'essaie 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 est compilé, mais pas mon code actuel. Cependant, j'ai essayé avec les 2 lignes à l'intérieur de X::X()
exactement les mêmes dans mon code actuel, et cela ne fonctionne pas.
Que devrais-je rechercher pour déboguer plus loin? Mon code actuel contient également #include
s autres en-têtes. Cela pourrait-il causer le problème? Est-ce que l'ordre d'inclusion des en-têtes est important?
Edit PRIu64
est défini 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"
Une autre possibilité pour ce problème que je viens de trouver dans mon propre code est si un autre en-tête contient déjà <inttypes.h>
before vous définissez __STDC_FORMAT_MACROS
. Par exemple:
Utils.h (Peut-être écrit à l'origine pour C, comme c'était le cas dans notre cas):
#include <inttypes.h>
// ... Function declarations
MyFile.cpp :
#include "Utils.h"
#define __STDC_FORMAT_MACROS
#include <inttypes.h>
Puisque inttypes.h
a déjà été inclus par Util.h
, le compilateur ne l'inclut pas à nouveau et ne voit pas la déclaration de __STDC_FORMAT_MACROS
.
La solution est soit de modifier Utils.h
pour inclure #define __STDC_FORMAT_MACROS
, soit de vous assurer de le définir avant toute inclusion dans MyFile.cpp
.
#define __STDC_FORMAT_MACROS
#include "Utils.h"
#include <inttypes.h>
La configuration initiale compilait parfaitement GCC 4.8 sur Ubuntu, mais échouait avec une ancienne chaîne d’outils GCC 4.3 pour PowerPC, ce qui le rendait encore plus perplexe au début.
En C++, les macros ne sont pas automatiquement définies en incluant simplement le fichier.
Vous devez ajouter ce qui suit:
#define __STDC_FORMAT_MACROS 1
avant
#include <inttypes.h>
Comment imprimer uint64_t? Échec avec: "‘% ’en fin de chaîne"
PRIu64
n'est pas défini là où vous l'utilisez.
Remplacez-le par la chaîne "llu"
et votre code sera compilé (mais ce n'est pas un correctif, cela ne fait que montrer le problème)
Peut-être que la variable include
est manquante. Peut-être que sur les zélos, les gardes sont inclus et qu’ils sont inclus sans que le jeton magique ne bloque la define
. Peut-être que votre pch est cassé.
Si vous êtes sur la plate-forme Android JNI. Mettez ceci dans votre Android.mk:
LOCAL_CPPFLAGS := -D__STDC_FORMAT_MACROS