Comencé la práctica de programación en codechef y me ha confundido la diferencia entre C y C99. ¿Qué significa C aquí? ¿Es C89? Verifique los idiomas al final de este envío . Contiene C y C99.
Encontré en Internet algo llamado GNU C. ¿Existe una C diferente para los sistemas Linux / Unix? ¿Cumplen con los estándares C de ANSI? También he leído en algunos lugares "C99 estricto". ¿Que es esto?
¿Existen otros estándares diferentes de C en uso? ¿Hay algo llamado C 4.3.2 o es la versión gcc en uso actual?
EDITAR:
Esto , esto , esto ayudó. Buscaré más y editaré las cosas que quedan sin respuesta.
No soy un novato en programación. Sé lo que es el lenguaje C. Sé que existen diferentes estándares C de ANSI como C89, C99 y C11.
Respuestas:
Todo lo que precede a la estandarización se llama generalmente "K&R C", en honor al famoso libro , con Dennis Ritchie, el inventor del lenguaje C, como uno de los autores. Este fue "el lenguaje C" de 1972 a 1989.
El primer estándar C fue lanzado en 1989 a nivel nacional en EE. UU., Por su instituto nacional de estándares ANSI. Esta versión se llama C89 o ANSI-C. De 1989 a 1990 este fue "el lenguaje C".
Al año siguiente, la norma estadounidense fue aceptada internacionalmente y publicada por ISO (ISO 9899: 1990). Esta versión se llama C90. Técnicamente, es el mismo estándar que C89 / ANSI-C. Formalmente, reemplazó a C89 / ANSI-C, haciéndolos obsoletos. De 1990 a 1999, C90 fue "el lenguaje C".
Tenga en cuenta que desde 1989, ANSI no ha tenido nada que ver con el lenguaje C. Los programadores que todavía hablan de "ANSI C" generalmente no tienen ni idea de lo que significa. ISO "posee" el lenguaje C, a través del estándar ISO 9899.
En 1995 se publicó una actualización menor, a la que a veces se hace referencia como "C95". Esta no fue una revisión importante, sino más bien una enmienda técnica formalmente denominada ISO / IEC 9899: 1990 / Amd.1: 1995. El principal cambio fue la introducción de un amplio soporte de caracteres.
En 1999, la norma C pasó por una importante revisión (ISO 9899: 1999). Esta versión del estándar se llama C99. De 1999 a 2011, este fue "el lenguaje C".
En 2011, la norma C se volvió a cambiar (ISO 9899: 2011). Esta versión se llama C11. Varias nuevas características como
_Generic
,_Static_assert
y soporte para hilos se añadieron a la lengua. La actualización se centró mucho en la secuenciación de expresiones, multiprocesamiento y de múltiples núcleos. De 2011 a 2017, este fue "el lenguaje C".En 2017, se revisó C11 y se solucionaron varios informes de defectos. Este estándar se llama informalmente C17 y se publicó como ISO 9899: 2018. No contiene nuevas funciones, solo correcciones. Es la versión actual del lenguaje C.
"C99 estricto" probablemente se refiere a una configuración del compilador que obliga a un compilador a seguir el estándar al pie de la letra. Hay un término que se ajusta a la implementación en el estándar C. Esencialmente significa: "este compilador realmente implementa el lenguaje C correctamente". Los programas que implementan el lenguaje C correctamente se denominan formalmente programas estrictamente conformes .
"GNU C" puede significar dos cosas. O el compilador de C que viene como parte de la Colección de compiladores GNU (GCC). O puede significar la configuración predeterminada no estándar que usa el compilador de GCC C. Si compila con
gcc program.c
, no lo hace de acuerdo con el estándar C, sino con una configuración GNU no estándar, que puede denominarse "GNU C". Por ejemplo, todo el kernel de Linux está hecho en GNU C no estándar y no en C.Si desea compilar sus programas de acuerdo con el estándar C, debe escribir
gcc -std=c99 -pedantic-errors
. Reemplace c99 con c11 si su versión de GCC lo admite.fuente
DEBO responder con respecto a ANSI C. Aunque ANSI no ha hecho nada con él, todavía se construyen compiladores. Compilador PIC XC16, por ejemplo: "El compilador es un compilador totalmente validado que cumple con el estándar ANSI C como se define en la especificación ANSI (ANSI x3.159-1989) y se describe en El lenguaje de programación C de Kernighan y Ritchie (segunda edición). ... "No toda la programación es para computadoras" grandes "como las PC. Escribir un compilador para su dispositivo cuesta y validar cuesta tiempo y $. ANSI C está vivo y sano en sus dispositivos integrados / en tiempo real.
fuente
ANSI C: El primer lenguaje C fue estandarizado por el organismo llamado ANSI en 1989, por eso se llama c89.
C99:
con la demanda de los requisitos de los desarrolladores, en 1999-2000 se han incluido más palabras clave y características adicionales en C99 (por ejemplo: en línea, booleano. Se agregaron funciones de biblioteca arthematic de punto flotante)
GNU C: GNU es un sistema operativo similar a Unix (www.gnu.org) y en algún lugar el proyecto de GNU necesita un lenguaje de programación C basado en el estándar ANSI C. GNU usa el compilador GCC (GNU Compiler Collection) para compilar el código. Tiene una función de biblioteca C que define llamadas al sistema como malloc, calloc, exit ... etc.
ANSI C es un estándar que está siendo utilizado o referenciado por otros estándares.
fuente
Además de la respuesta de Lundin
Esto es lo que Dennis Richie tiene que decir cuando se le pregunta
"¿Por qué K&R no esperó la norma ANSI final aprobada antes de escribir la segunda edición de K&R?"
fuente
int i; int test(double *p) { i=1; *p=2.0; return i; }
un compilador no debería tener que recargarsei
después de la escritura*p
en caso de quep
pudiera contener la dirección dei
. Perfectamente razonable. El problema es que los compiladores modernos usan la misma regla para justificar las suposiciones de que la escritura en along*
no afectará along long
, incluso si ambos tipos tienen el mismo tamaño y representación , y que incluso si dos estructuras comparten una secuencia inicial común, el código nunca usará un puntero de un tipo para leer un miembro de CIS escrito a través del otro.Esta pregunta no se buscó a fondo en la red para obtener una respuesta, de todos modos puede ver esto:
-std=c99
que ya se menciona en las otras respuestas.fuente
gcc
admite-std=c89
y-std=gnu89
y-std=c99
y-std=gnu99
(y las versiones suficientemente modernas admiten-std=c11
y-std=gnu11
). La diferencia está en que las extensiones sobre el estándar C están disponibles automáticamente o solo cuando la fuente empuja al compilador para que les proporcione las macros apropiadas (como-D_XOPEN_SOURCE=700
).