Pregunta

Yo suelo escribir código C en C89, ahora algunas de las características de C99 (como intxx_t o __VA_ARGS__ o snprintf) son muy útiles, y puede ser incluso vital.

Antes de que yo más mis requisitos de C89 a C99 que quería saber cuál de las características de C99 fueron ampliamente apoyadas y cuáles no fueron apoyados ampliamente o incluso perjudicial.

Sé que podríamos simplemente comprobar nuestro apoyo compilador objetivo, pero esto reduciría nuestro apoyo mucho, y ya que esto es para el software de código abierto, preferiría tener un apoyo más amplio.

Por ejemplo, utilizamos Solaris compilador (suncc) y gcc, pero puede haber otros compilador nos moverse fuera del camino mientras que podíamos mantener la compatibilidad con muy poco esfuerzo.

Por ejemplo, nunca trabajaron en Windows ni yo sabemos nada acerca de los compiladores de Windows, pero sería bueno para mantener la compatibilidad con Windows.

¿Fue útil?

Solución

Una serie de características C99 son opcionales, por lo que su falta no es técnicamente no conforme. No voy a distinguir a continuación.

  • Hmm, la victoria no tiene <stdint.h>, aunque hay un proceso abierto versión -fuente de stdint.h para Microsoft . Incluso cuando se implementa el archivo, muchos de los tipos individuales están desaparecidos.

  • Complejo de apoyo e imaginario es a menudo ausente o roto.

  • identificadores extendida y caracteres anchos pueden ser puntos de problemas.

esta lista de C99 cuestiones de entidad en gcc.

Otros consejos

goto sigue siendo considerada href="http://en.wikipedia.org/wiki/Considered_harmful" rel="noreferrer"> perjudiciales.


De alguna manera he recogido cuatro abajo votos. Presenté la declaración anterior para agregar la ligereza, y soy sólo el 30% en serio el concepto detrás de él.

espero que los votos de abajo son jóvenes que no entienden la historia de los lenguajes de programación. No cada goto es malo, pero, en comparación con el código espagueti adulterada 100% He trabajado en (millones de líneas de FORTRAN 66) -es razonable y productiva para reemplazar tantas declaraciones goto con declaraciones estructuradas (for, while, do .. while, switch) como sea posible. Pero a veces un goto está bien cuando se evita la complejidad, tales como variables bandera extra para salir de múltiples bucles anidados.

Bueno, GCC es básicamente va a ser gcc independientemente del sistema operativo de escritorio de orientación.

Visual C ++, siendo principalmente un compilador de C ++, no es tan preocupados con la especificación C99. stdint.h hace declarar sus macros favoritos intxx_t. __VA_ARGS__ está disponible. _Bool, _Complex y _Pragma no se implementan en el compilador Microsoft Visual C ++. Estoy bastante seguro% no se han aplicado a los campos en printf / scanf, aunque quizás VC2010 los maneja. snprintf está presente, pero tiene un subrayado inicial y semántica ligeramente diferente.

Respuesta corta: La característica "más fácil" C99 es poner en práctica sin cambiar las gramáticas del compilador o nueva plomería la biblioteca estándar, más probable es VC ++ para apoyarlo. Si hay un conflicto entre C99 y C ++, C ++ esperar a ganar.

sizeof tiempo de ejecución es una pesadilla de los escritores de compilador. Por lo que considero es perjudicial.

glibc no implementa un realloc C99 conformes, por lo realloc(ptr, 0) no es portátil.

http://sourceware.org/bugzilla/show_bug.cgi?id=12547

restrict se convirtió en una palabra clave en C99. Que está invadiendo el espacio de nombres de la aplicación de los usuarios. Si usted tiene un programa de C89 válido que contiene la palabra restrict, debe cambiar su programa para que funcione con C99. En otras palabras: no hay compatibilidad con versiones anteriores. Si iban a romper la compatibilidad hacia atrás, deben tener gets alejado de la norma primera.

Las funciones matemáticas de tipo genérico de <tgmath.h> no necesariamente se aplican ampliamente, a pesar de que parecen estar siempre con GCC 4.2.1 en MacOS X 10.6.2.

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