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 gcc version 4.6.1 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]
main.c
et le compilez avec gcc, tout devrait fonctionner correctement.-std=c11
ou la version de la norme que vous utilisez. Cela rattrape cela et d'autres erreurs. Je recommande aussi-Wall -Wextra -Wpedantic -Wconversion
au moins.Réponses:
La norme ISO C99 spécifie que ces macros ne doivent être définies que si elles sont explicitement demandées.
la source
__STDC_FORMAT_MACROS
macro n'est requise que pour l'inclusion dans C ++.__STDC_FORMAT_MACROS
apparaît uniquement dans une note de bas de page en C99, suggérant que C ++ ne définisse ces macros qu'en présence de la requête. Cependant, le comité C ++ a choisi d'ignorer la suggestion: par exemple dans le projet n3242, 27.9.2 / 3: Note: Les macros définies par <cinttypes> sont fournies sans condition. En particulier, le symbole __STDC_FORMAT_MACROS, mentionné dans la note de bas de page 182 du standard C, ne joue aucun rôle en C ++. Ainsi, lorsque les compilateurs rattraperont leur retard, nous n'aurons pas besoin__STDC_FORMAT_MACROS
de C ou C ++.-std=c++0x
et peut-être #include <cinttypes> plutôt que <inttypes.h>, je crois que cela fournirait les macros de format sans que vous fournissiez__STDC_FORMAT_MACROS
.Lors de la compilation de memcached sous Centos 5.xi a eu le même problème.
La solution consiste à mettre à niveau gcc et g ++ au moins vers la version 4.4.
Assurez-vous que votre CC / CXX est défini (exporté) sur les bons binaires avant la compilation.
la source
Puisque vous avez inclus la balise C ++, vous pouvez utiliser la bibliothèque {fmt} et éviter complètement la
PRIu64
macro et d'autresprintf
problèmes:La fonction de formatage basée sur cette bibliothèque est proposée pour la normalisation en C ++ 20: P0645 .
Avertissement : je suis l'auteur de {fmt}.
la source
sscanf
?scanf
.std::to_string()
. La page cppreference renvoie toujours uniquement versstd::to_chars()
, ce qui n'est pas vraiment ce dont les gens ont besoin. Je me demande sifmt
et / ou c ++ 20 s'en occupe ou pas encore.std::to_string
restera probablement telstd::format
quel , mais vous permet de contrôler si vous souhaitez utiliser la locale ou non (et par défaut, elle n'utilise pas la locale).