web-dev-qa-db-fra.com

Pourquoi PRIu64 ne fonctionne-t-il pas dans ce code?

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 #includes 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"
21
Masked Man

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.

17
Collin

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"

23
namaenashi

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é.

5

Si vous êtes sur la plate-forme Android JNI. Mettez ceci dans votre Android.mk:

LOCAL_CPPFLAGS := -D__STDC_FORMAT_MACROS
0
user18853