web-dev-qa-db-fra.com

Comment printf uint64_t? Échec avec: "‘% ’en traînant de travers '

J'ai écrit un code de test très simple de printf uint64_t:

#include <inttypes.h>
#include <stdio.h>

int main()
{
  uint64_t ui64 = 90;
  printf("test uint64_t : %" PRIu64 "\n", ui64);
  return 0;
}

J'utilise Ubuntu 11.10 (64 bits) et la version 4.6.1 de gcc pour le compiler, mais j'ai échoué:

main.cpp: In function ‘int main()’:
main.cpp:9:30: error: expected ‘)’ before ‘PRIu64’
main.cpp:9:47: warning: spurious trailing ‘%’ in format [-Wformat]
130
Dan

La norme ISO C99 spécifie que ces macros ne doivent être définies que si elles sont explicitement demandées.

#define __STDC_FORMAT_MACROS
#include <inttypes.h>

... now PRIu64 will work
159
Will

Lors de la compilation de memcached sous Centos 5.x, j’ai eu le même problème.

La solution consiste à mettre à niveau gcc et g ++ vers la version 4.4 au moins.

Assurez-vous que votre CC/CXX est défini (exporté) sur les fichiers binaires corrects avant la compilation.

4
Anders Eliasson

Puisque vous avez inclus la balise C++, vous pouvez utiliser la bibliothèque {fmt} et éviter la macro PRIu64 et d’autres problèmes printf:

#include <fmt/core.h>

int main() {
  uint64_t ui64 = 90;
  fmt::print("test uint64_t : {}\n", ui64);
}

La facilité de formatage basée sur cette bibliothèque est proposée pour normalisation en C++ 20: P0645 .

Disclaimer: je suis l'auteur de {fmt}.

0
vitaut