¿Por qué no se adoptaron nuevas cadenas de opciones de formato printf() (específicas del ancho de bits) como parte de C99?

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

Pregunta

Mientras investiga cómo hacer multiplataforma printf() formatear cadenas en C (es decir, teniendo en cuenta el número de bits que espero que tenga cada argumento entero). printf() debería ser) me encontré esta sección del artículo de Wikipedia sobre printf().El artículo analiza opciones no estándar que se pueden pasar a printf() cadenas de formato, como (lo que parece ser una extensión específica de Microsoft):

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

Continúa afirmando que:

ISO C99 incluye el archivo de encabezado inttypes.h que incluye una serie de macros para su uso en la codificación PrintF independiente de la plataforma.

...y luego enumera un conjunto de macros que se pueden encontrar en dicho encabezado.Mirando el archivo de encabezado, para usarlos tendría que escribir:

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

Mi pregunta es:¿Me estoy perdiendo de algo?¿Es esta realmente la forma estándar de hacerlo en C99?Si es así, ¿por qué?(Aunque no me sorprende nunca haber visto código que use las cadenas de formato de esta manera, ya que parece muy engorroso...)

¿Fue útil?

Solución

El Fundamento C parece implicar que la práctica está estandarizando existente:

  

fue derivado de la cabecera del mismo nombre que se encuentra en varios sistemas de 64 bits existentes.

pero el resto del texto no escribe sobre esas macros, y no recuerdo que estaban práctica existente en ese momento.

Lo que sigue es sólo una especulación, pero educado por la experiencia de cómo funcionan los comités de normalización.

Una de las ventajas de las macros C99 más de estandarización de especificador de formato adicional para printf (tenga en cuenta que el C99 también hizo añadir un poco) es que proporciona <inttypes.h> y <stdint.h> cuando ya tiene una implementación apoyar las características requeridas de una manera específica aplicación está escribiendo dos typedef archivos con macros y adecuada. Esto reduce el costo de hacer conformes aplicación existente, reduce el riesgo de rotura de los programas existentes que hacen uso de las características de implementaciones específicas existentes (la forma estándar no interfiere) y facilitar la portabilidad de los programas de aplicación conformes a que no tienen estos cabeceras (que pueden ser proporcionados por el programa). Además, si las formas específicas de la implementación ya se variaron en el momento, no favorize una aplicación sobre otra.

Otros consejos

Así es, así es como el estándar C99 dice que se debe utilizar. Si desea que el código realmente portablt que es 100% en estándares conformes a la carta, siempre se debe imprimir una int usando "%d" y un uso de int32_t "%"PRId32.

La mayoría de las personas no se molestan, sin embargo, ya que hay muy pocos casos en los que no realizarlo importaría. A menos que estés portar su código para Win16 o DOS, se puede asumir que sizeof(int32_t) <= sizeof(int), por lo que es inofensivo para printf accidentalmente un int32_t como int. Del mismo modo, un long long es casi universalmente 64 bits (aunque no se garantiza que sea así), por lo que la impresión de una int64_t como long long (por ejemplo con un especificador de %llx) es seguro también.

El int_fast32_t tipos, int_least32_t, y otros se utilizan casi nunca, por lo que se puede imaginar que sus especificadores de formato correspondientes se utilizan aún más raramente.

Siempre se puede echar hacia arriba y utilizar %jd que es el especificador de formato intmax_t.

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

He utilizado intmax_t para mostrar que cualquier intXX_t se puede utilizar, sino que simplemente echando a long es mucho mejor para el caso int32_t, a continuación, utilizar %ld.

Sólo puedo especular sobre por qué.Me gusta la respuesta anterior de AProgrammer, pero se pasa por alto un aspecto: ¿Qué vas a agregar a printf como modificador de formato? Ya existen dos formas diferentes en que se usan los números en una cadena en formato printf (ancho y precisión).Agregar un tercer tipo de número para decir cuántos bits de precisión hay en el argumento sería genial, pero ¿dónde lo colocarás sin confundir a la gente?Desafortunadamente, uno de los defectos de C es que printf no fue diseñado para ser extensible.

Las macros son horribles, pero cuando tienes que escribir código que sea portátil en plataformas de 32 y 64 bits, son una bendición.Definitivamente me salvó el tocino.

Creo que la respuesta a tu pregunta por qué es cualquiera

  • Nadie podría pensar en una mejor manera de hacerlo, o
  • El comité de estándares no pudo ponerse de acuerdo sobre nada que consideraran claramente mejor.

Otra posibilidad: la compatibilidad hacia atrás. Si agrega más especificadores de formato a printf u opciones adicionales, es posible que un especificador en algún código pre-C99 tendría una cadena de formato interpreta de manera diferente.

Con el cambio C99, no se va a modificar la funcionalidad de printf.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top