2008-09-26 7 views
44

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

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

+3

no se olvide de las bibliotecas. Además de una buena sintaxis (como los inicializadores de estructuras nombradas), C99 agrega muchas funciones útiles de biblioteca matemática, como long lrtint (double); que hace la operación de redondeo rápido que de otro modo tendría que hackear como (largo) (x + 0.5). –

+0

El compilador PGCC de alto rendimiento del Grupo Portland es 100% compatible con C99. –

Respuesta

20

Si desea escribir código C portátil, entonces 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 very good C99 support y produce binarios rápidos. (¡Gracias 0x69!)

MSVC admite some new features y Microsoft planea ampliar el soporte en versiones futuras.

GCC es compatible con algunas cosas nuevas de C99. Crearon una tabla sobre el status of C99 features. Probablemente la característica más útil de C99 es la matriz de longitud variable, y GCC la admite ahora. Clang (C frontal de LLVM) es compatible con la mayoría de las funciones, excepto pragmas de coma flotante.

Wikipedia parece tener un nice summary of C99 support de los compiladores.

+0

Por ANSI C, ¿te refieres a C89/C90? Porque ANSI C y ISO C solían ser sinónimos, pero entiendo que ahora ISO C se refiere a C99 –

+7

GCC 4.5 finalmente enumera arreglos de longitud variable como * Listo * y no * Roto *! – u0b34a0f6ae

+0

@ kaizer.se: Gracias por informarnos. – KovBal

7

Para gcc, hay un table with all supported features. 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.

+0

Los VLA son totalmente compatibles desde gcc 4.5. –

3

Consulte C99 suport status for GNU para obtener más información sobre las funciones actualmente admitidas.

Sun Studio se supone que es compatible con toda la especificación 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 el momento

2

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

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

16

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

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

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

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

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

Para evitar el no soporte de Microsoft, utilizo un public domain stdint.h from MinGW (que he modificado para trabajar también en VC6) y un nearly public domain snprintf() from Holger Weiss

Los productos que no son soportadas por Microsoft, pero todavía va a utilizar en otros compiladores en función del proyecto incluyen:

  • declaraciones mixtos y código
  • funciones en línea
  • _Pragma() - esto hace mucho más pragmas utilizables
+1

VS2010 proporciona stdint.h – maep

+0

Sí - VS2010 agregó algunas de las cosas C99 que se incorporaron en C++ 0x. stdint.h es una de las adiciones más importantes. –

+0

VS2013 admite declaraciones mixtas y código, y snprintf se planifica en la próxima revisión de Visual Studio. –

5

El compilador de C de IBM tiene supp c99 ort cuando se invoca como c99 pero no cuando se invoca como cc o xlc.

+0

Debe haber una opción como es para gnu con '-std = c99' – osgx

+2

@osgx sí, eso es correcto: podría usar la opción -qlanglvl = stdc99 por ejemplo – frankster

3

Clang (el compilador de 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.