Comme l'a dit AraK, l'interface des flux c ++ fonctionnera toujours de manière portable.
std :: size_t s = 1024; std :: cout << s; // ou tout autre type de flux comme stringstream!
Si vous voulez C stdio, il n'y a pas de réponse portable à cela pour certains cas de "portable". Et cela devient moche car, comme vous l'avez vu, choisir les mauvais indicateurs de format peut générer un avertissement du compilateur ou donner une sortie incorrecte.
C99 a essayé de résoudre ce problème avec des formats inttypes.h comme "%" PRIdMAX "\ n". Mais tout comme avec "% zu", tout le monde ne prend pas en charge c99 (comme MSVS avant 2013). Il y a des fichiers "msinttypes.h" qui flottent pour gérer cela.
Si vous effectuez un cast vers un type différent, selon les indicateurs, vous pouvez obtenir un avertissement du compilateur pour la troncature ou un changement de signe. Si vous suivez cette route, choisissez un type de taille fixe pertinent plus grand. L'un des longs non signés et "% llu" ou des longs "% lu" non signés devrait fonctionner, mais llu peut également ralentir les choses dans un monde 32 bits comme excessivement grand. (Modifier - mon mac émet un avertissement en 64 bits pour% llu ne correspondant pas à size_t, même si% lu,% llu et size_t sont tous de la même taille. Et% lu et% llu ne sont pas de la même taille sur mon MSVS2012. Donc vous devrez peut-être caster + utiliser un format qui correspond.)
Pour cette question, vous pouvez aller avec des types de taille fixe, tels que int64_t. Mais attendez! Maintenant, nous sommes de retour à c99 / c ++ 11, et les anciens MSVS échouent à nouveau. De plus, vous avez également des moulages (par exemple map.size () n'est pas un type de taille fixe)!
Vous pouvez utiliser un en-tête ou une bibliothèque tiers tel que boost. Si vous n'en utilisez pas déjà un, vous ne voudrez peut-être pas gonfler votre projet de cette façon. Si vous êtes prêt à en ajouter un juste pour ce problème, pourquoi ne pas utiliser des flux c ++ ou une compilation conditionnelle?
Donc, vous en êtes aux flux c ++, à la compilation conditionnelle, aux frameworks tiers ou à quelque chose de portable qui vous convient.
unsigned long
est la meilleure option si votre implémentation libc ne prend pas en charge lez
modificateur; la norme C99 recommande desize_t
ne pas avoir un rang de conversion entier supérieur àlong
, donc vous êtes raisonnablement en sécurité