Pourquoi ne sont pas nouvelles (largeur bits spécifiques) chaînes d'option de format printf () dans le cadre de adoped C99?

StackOverflow https://stackoverflow.com/questions/1183679

Question

Alors que des recherches sur la façon de faire des chaînes de format printf() multiplateformes en C (qui est, en tenant compte du nombre de bits que j'attends chaque argument entier à printf() devrait être) je suis tombé sur cette section de l'article de Wikipedia sur printf(). L'article traite des options non standard qui peuvent être transmis à printf() chaînes de format, tels que (ce qui semble être une extension spécifique à Microsoft):

printf("%I32d\n", my32bitInt);

Il poursuit en disant que:

  

ISO C99 comprend l'en-tête inttypes.h   fichier qui comprend un certain nombre de macros   pour une utilisation dans printf plate-forme indépendante   codage.

... et énumère ensuite un ensemble de macros qui peuvent être trouvés dans ladite tête. En regardant le fichier d'en-tête, pour les utiliser, je dois écrire:

 printf("%"PRId32"\n", my32bitInt);

Ma question est: suis-je manque quelque chose? Est-ce vraiment la façon standard C99 de le faire? Si oui, pourquoi? (Bien que je ne suis pas surpris que je ne l'ai jamais vu du code qui utilise les chaînes de format de cette façon, car il semble si lourd ...)

Était-ce utile?

La solution

La Justification C semble impliquer que normalise la pratique actuelle:

  

a été dérivé de l'en-tête du même nom se trouve sur plusieurs systèmes 64 bits existants.

mais le reste du texte n'écrit pas les macros, et je ne me souviens pas qu'ils étaient la pratique en vigueur à l'époque.

Ce qui suit est la spéculation juste, mais instruits par l'expérience de la façon dont les comités de normalisation travaillent.

L'un des avantages des macros C99 sur la standardisation spécificateur de format supplémentaire pour printf (notez que C99 a également fait ajouter un peu) est que fournir lorsque vous avez déjà <inttypes.h> et <stdint.h> une implémentation supportant les fonctionnalités requises d'une manière spécifique de mise en œuvre est en train d'écrire deux fichiers avec typedef et macros adéquates. Cela réduit le coût de fabrication conforme de la mise en œuvre existante, réduit le risque de rupture des programmes existants qui ont utilisé des spécificités de mise en œuvre existantes caractéristiques (la manière standard ne gêne pas) et faciliter le portage des programmes conforme à l 'à la mise en œuvre qui n'ont pas ces les en-têtes (ils peuvent être fournis par le programme). De plus, si les moyens spécifiques de mise en œuvre déjà varié à l'époque, il ne favorize pas une mise en œuvre sur une autre.

Autres conseils

Corriger, voici comment la norme C99 dit que vous devez les utiliser. Si vous voulez vraiment le code portablt qui est 100% conformes aux standards à la lettre, vous devriez toujours imprimer une int en utilisant "%d" et un int32_t en utilisant "%"PRId32.

La plupart des gens ne seront pas pris la peine, cependant, car il y a très peu de cas où l'omission de le faire serait d'importance. À moins que vous le portage de votre code pour Win16 ou DOS, vous pouvez supposer que sizeof(int32_t) <= sizeof(int), il est donc sans danger pour printf accidentellement un int32_t comme int. De même, un long long est à peu près universellement 64 bits (bien que l'on ne peut pas garantir l'être), l'impression d'une manière int64_t comme long long (par exemple avec un spécificateur de %llx) est sûr ainsi.

Les types int_fast32_t, int_least32_t, et al ne sont presque jamais utilisé, vous pouvez donc imaginer que leurs formats correspondants sont utilisés encore plus rarement.

Vous pouvez toujours jeter vers le haut et utiliser %jd qui est le spécificateur format intmax_t.

printf("%jd\n", (intmax_t)(-2));

je intmax_t pour montrer que toute intXX_t peut être utilisé, mais simplement coulée à long est beaucoup mieux pour le cas int32_t, utilisez %ld.

Je ne peux que spéculer sur les raisons. J'aime la réponse de AProgrammer ci-dessus, mais il y a un aspect négligé: ce sont comme modificateur de format va ajouter à printf Il y a déjà deux façons numéros différents sont utilisés dans une chaîne de format printf (largeur et précision). Ajout d'un troisième type de nombre de dire combien de bits de précision sont dans l'argument serait génial, mais où allez-vous le mettre sans embrouiller les gens? Unfortunatey l'un des défauts de C est que printf n'a pas été conçu pour être extensible.

Les macros sont affreux, mais quand vous devez écrire du code qui est portable sur les plates-formes 32 bits et 64 bits, ils sont un don du ciel. Certainement sauvé le bacon.

Je pense que la réponse à votre question pourquoi est soit

  • Personne ne pouvait penser à une meilleure façon de le faire, ou
  • Le comité des normes ne pouvait se mettre d'accord sur tout ce qu'ils estimaient être nettement mieux.

Une autre possibilité: compatibilité descendante. Si vous ajoutez plus de formats de type à printf, ou d'autres options, il est possible qu'un prescripteur dans un code pré-C99 aurait une chaîne de format interprété différemment.

Avec le changement C99, vous ne changez pas la fonctionnalité de printf.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top