standard programa lenguaje last language general estructura estandar descargar compiler c c99 standards-compliance

programa - ¿Cuán universalmente es compatible con C99?



estructura general de un programa en lenguaje c (7)

Clang (el compilador C y C ++ basado en LLVM) tiene una buena compatibilidad con C99. Creo que lo único que no admite son los pragmas de coma flotante.

¿Cuán universalmente es compatible el estándar C99 en los compiladores de hoy? Entiendo que ni siquiera GCC lo admite por completo. Es esto correcto ?

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

Gracias


Mire el estado de soporte de C99 para GNU para obtener detalles sobre qué funciones son compatibles actualmente.

Se supone que Sun Studio es compatible con todas las especificaciones C99. Nunca los he usado, entonces no puedo confirmarlo.

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


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


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


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

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

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

Las características C99 que utilizo regularmente parecen estar bastante bien respaldadas (excepto por Microsoft):

  • stdint.h
  • snprintf() - MS tiene un _snprintf() no estándar _snprintf() que tiene serias limitaciones de no siempre la terminación nula del búfer y no indica qué tan grande debe ser el búfer

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

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

  • declaraciones mixtas y código
  • funciones en línea
  • _Pragma() - esto hace que los pragmas sean mucho más útiles

Si desea escribir 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 buena compatibilidad con C99 y produce binarios rápidos. (¡Gracias 0x69 !)

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

GCC es compatible con 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 (fachada C de LLVM) admite la mayoría de las funciones, excepto pragmas de coma flotante.

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


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

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