101 votes

Nettoyer le code vers size_t printf en C++ (ou : le plus proche équivalent de C99 ' s %z en C++)

J'ai peu de code C++ qui imprime un size_t:

size_t a;
printf("%lu", a);

Je voudrais compiler sans mises en garde sur les versions 32 et 64 bits architectures.

Si c'était le C99, je pourrais utiliser printf("%z", a);. Mais AFAICT %z n'existe pas dans n'importe quel standard de C++ dialecte. Donc, au lieu de cela, j'ai à faire

printf("%lu", (unsigned long) a);

ce qui est vraiment moche.

Si il n'y a pas d'installation pour l'impression d' size_ts construite dans la langue, je me demande si il est possible d'écrire un printf wrapper ou somesuch tels que va insérer le jette sur size_ts, de manière à éliminer les parasites des avertissements du compilateur, tout en conservant les bonnes.

Des idées?


Modifier

Afin de clarifier la raison pour laquelle je suis à l'aide de printf: j'ai une assez grande base de code que je suis le nettoyage. Il utilise printf wrappers pour faire des choses comme "écrire un avertissement, l'enregistrer dans un fichier, et éventuellement de quitter le code avec une erreur". Je pourrais être en mesure de rassembler assez de C++-foo de le faire avec un cout wrapper, mais je préfère ne pas en changer tous les warn() appel dans le programme juste pour se débarrasser de certains des avertissements du compilateur.

72voto

Will Points 30630

Le spécificateur de format fonctionne parfaitement sur les systèmes de C++ ; il n’y a pas besoin de faire plus compliqué.

61voto

dalle Points 9083

La plupart des compilateurs ont leur propres spécificateur pour et arguments, Visual C++ utilisent par exemple UI et % Id respectivement, je pense que gcc vous permettra d’utiliser zu % et % zd.

Vous pouvez créer une macro :

Utilisation :

16voto

meissnersd Points 366

Sur windows et la mise en œuvre de Visual Studio de printf

fonctionne pour moi. Voir msdn

12voto

Warren Young Points 16324

Puisque vous êtes à l'aide de C++, pourquoi ne pas utiliser IOStreams? Qui devrait compiler sans mises en garde et faire le bon type-connaissance de la chose, aussi longtemps que vous n'êtes pas à l'aide d'une mort cérébrale implémentation C++ qui ne définit pas un operator << pour size_t.

Lors de la sortie réelle doit être fait avec printf(), vous pouvez toujours combiner avec IOStreams pour obtenir le type-safe comportement:

size_t foo = bar;
ostringstream os;
os << foo;
printf("%s", os.str().c_str());

Ce n'est pas super efficace, mais votre cas ci-dessus traite de fichier I/O, donc, c'est votre goulot d'étranglement, pas cette chaîne de mise en forme du code.

7voto

stijn Points 13405

Voici une solution possible, mais il n’est pas tout à fait une jolie...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X