Pregunta

¿Cuán universalmente se admite el estándar C99 en los compiladores de hoy? Entiendo que ni siquiera GCC lo apoya completamente. ¿Es esto correcto?

¿Qué características de C99 son más compatibles que otras, es decir, qué puedo usar para estar seguro de que la mayoría de los compiladores me entenderán?

¿Fue útil?

Solución

Si desea escribir un código C portátil, le sugiero que escriba en C89 (antiguo estándar ANSI C). Este estándar es compatible con la mayoría de los compiladores.

El compilador Intel C tiene muy bueno Soporte C99 y produce binarios rápidos. (¡Gracias 0x69 !)

MSVC admite algunas características nuevas y el plan de Microsoft para ampliar el soporte en futuras versiones.

GCC admite algunas cosas nuevas de C99. Crearon una tabla sobre el estado de las características de C99 . Probablemente la característica más útil de C99 es la matriz de longitud variable, y GCC la admite ahora. Clang (con C de LLVM) es compatible con la mayoría de las funciones, excepto los programas de punto flotante.

Wikipedia parece tener un buen resumen del soporte de C99 de los compiladores.

Otros consejos

Alguien mencionó que el compilador de Intel tiene soporte para C99. También existe el el compilador Comeau C / C ++ que es totalmente compatible con C99. Estos son los únicos que conozco.

Las características de C99 que no uso porque no están bien soportadas incluyen:

  • matrices de longitud variable
  • macros con número variable de parámetros.

Las características de C99 que utilizo con regularidad parecen estar bastante bien soportadas (excepto por Microsoft):

  • stdint.h
  • snprintf () - MS tiene un _snprintf () no estándar que tiene serias limitaciones de no siempre terminar nulo el buffer y no indicar qué tan grande debe ser el buffer

Para solucionar el problema de la falta de soporte técnico de Microsoft, utilizo un dominio público stdint.h de MinGW (que también modifiqué para que funcione en VC6) y un casi público dominio snprintf () de Holger Weiss

Los elementos que no son compatibles con Microsoft, pero que se seguirán utilizando en otros compiladores, según el proyecto, incluyen:

  • declaraciones y código mixtos
  • funciones en línea
  • _Pragma () : esto hace que los pragmas sean mucho más fáciles de usar

Para gcc, hay una tabla con todas las funciones compatibles . Parece ser que lo más importante que faltan son las matrices de longitud variable. La mayoría de las otras funciones faltantes son problemas de biblioteca en lugar de funciones de idioma.

El compilador IBM c tiene soporte para c99 cuando se invoca como c99 pero no cuando se invoca como cc o xlc.

Consulte Estado de soporte C99 para GNU para obtener detalles sobre las funciones que se admiten actualmente.

Sun Studio está destinado a admite toda la especificación C99. Nunca los he usado, así que no puedo confirmar.

No creo que el compilador de Microsoft sea compatible con la especificación C99 en su totalidad. Están mucho más centrados en C ++ en este momento

Clang (el compilador C y C ++ basado en LLVM) tiene bastante buen soporte C99. Creo que lo único que no admite son los pragmas de punto flotante.

Microsoft parece estar siguiendo los estándares de C ++, pero no tiene soporte para C99. (Pueden elegir algunas características, pero se puede decir que es C ++ 0x, donde hay una superposición).

A partir de Visual Studio .NET 2003, los nuevos proyectos tienen la opción 'Compilar código C como C ++ (/ TP)' habilitada de forma predeterminada.

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