C1x se ha convertido en ISO/IEC 9899:2011, también conocido como C11.
¿Alguien sabe qué cambios (si los hay) hay en el Estándar desde el Abril 2011 borrador n1570?
ETA: Están las actas del Comité de Londres (marzo de 2011) (que deberían incluirse en n1570) aquíy de Washington, DC (octubre de 2011) aquí; Supongo que una lista de cambios aceptados en las actas de DC debería cubrir las cosas.
Acabo de enterarme hoy de que hubo un cambio (algo) significativo entre N1570 y el estándar C11 final (ISO/IEC 9899:2011 (E)).
En N1570, 6.3.2p3 dice:
Excepto cuando es el operando del sizeof
operador, el _Alignof
operador, o el unario &
operador, o es un literal de cadena utilizado para inicializar una matriz, una expresión que tiene tipo “matriz de escribe” se convierte en una expresión de tipo “puntero a escribe” que apunta al elemento inicial del objeto de matriz y no es un valor l.
la inclusión de _Alignof
fue un error, ya que la sintaxis de un expresión-unaria permisos
_Alignof ( type-name )
pero no
_Alignof unary-expression
El estándar C11 publicado corrige este error y vuelve a la redacción C99:
Excepto cuando es el operando del sizeof
operador, o el unario &
operador, o es un literal de cadena utilizado para inicializar una matriz, una expresión que tiene tipo “matriz de escribe” se convierte en una expresión de tipo “puntero a escribe” que apunta al elemento inicial del objeto de matriz y no es un valor l.
Más información: en una publicación reciente en comp.std.c sobre las diferencias entre N1570 y el estándar publicado, Larry Jones, miembro del comité ISO C, escribió:
Hay varios de ellos, pero la mayoría son solo ajustes editoriales menores, cambios en el texto repetitivo y reorganización de las cosas para mantener contentos a los poderes. El mayor cambio fue eliminar _Alignof de un montón de lugares donde no debería haber sido agregado (basado en la noción errónea de que toma un tipo o una expresión como lo hace sizeof cuando en realidad solo toma un tipo): 6.3.2.1p2, p3, p4, fn. sesenta y cinco; y 6.7.1 nota al pie. 121.
ID de mensaje: <rfg33a-u0q.ln1@jones.homeip.net>
Aquí está la amenaza como se ve en groups.google.com.
Respondido por Jens Gustedt en los comentarios:
Según un comentario de Larry Jones en comp.std.c, no hubo cambios significativos con respecto a N1569 (que es N1570 sin marcadores de cambio). Lo único que queda sin resolver es el valor de __STDC_VERSION__
pero supongo que lo más natural será 201112L
.
ISO ha ratificado y publicado como ISO/IEC 9899:2011 el nuevo estándar C11 (C1x) para el lenguaje de programación C. Los principales cambios con respecto al estándar anterior (C99), tal como están escritos en el Artículo de Wikipedia C11son los siguientes:
El estándar incluye varios cambios en las especificaciones del lenguaje y la biblioteca C99, como:
- Especificación de alineación (
_Alignas
especificador, _Alignof
operador, aligned_alloc
función, <stdalign.h>
archivo de cabecera)
- los
_Noreturn
especificador de función
-
Escriba expresiones genéricas usando el _Generic
palabra clave. Por ejemplo, la siguiente macro cbrt(x)
se traduce a cbrtl(x)
, cbrt(x)
o cbrtf(x)
dependiendo del tipo de x
:
#define cbrt(X) _Generic((X), long double: cbrtl, \
default: cbrt, \
float: cbrtf)(X)
- Compatibilidad con subprocesos múltiples (
_Thread_local
especificador de clase de almacenamiento, <threads.h>
encabezado que incluye funciones de creación/gestión de subprocesos, exclusión mutua, variable de condición y funcionalidad de almacenamiento específica del subproceso, así como el _Atomic
calificador de tipo y <stdatomic.h>
para acceso ininterrumpido a objetos).
- Compatibilidad mejorada con Unicode basada en el informe técnico de C Unicode ISO/IEC TR 19769:2004 (
char16_t
y char32_t
tipos para almacenar datos codificados en UTF-16/UTF-32, incluidas las funciones de conversión en <uchar.h>
y el correspondiente u
y U
prefijos literales de cadena, así como los u8
prefijo para literales codificados en UTF-8).
- Eliminación de la
gets
función, en desuso en la revisión estándar del lenguaje C anterior, ISO/IEC 9899:1999/Cor.3:2007(E), a favor de una nueva alternativa segura, gets_s
.
- Interfaces de verificación de límites (Anexo K).
- Características de analizabilidad (Anexo L).
- Más macros para consultar las características de los tipos de coma flotante, en relación con los números de coma flotante subnormales y la cantidad de dígitos decimales que el tipo puede almacenar.
- Anónimo estructuras y sindicatosútil cuando las uniones y las estructuras están anidadas, por ejemplo, en
struct T { int tag; union { float x; int n; }; };
.
- Aserciones estáticas, que se evalúan durante la traducción en una fase posterior a la
#if
y #error
cuando los tipos son entendidos por el traductor.
- Un modo exclusivo de crear y abrir (
"…x"
sufijo) para fopen
. Esto se comporta como O_CREAT|O_EXCL
en POSIX, que se usa comúnmente para bloquear archivos.
- los
quick_exit
funcionar como una tercera forma de terminar un programa, con la intención de hacer al menos una mínima deinicialización si la terminación con exit
falla
- Macros para la construcción de valores complejos (en parte porque
real + imaginary*I
podría no producir el valor esperado si imaginary
es infinito o NaN).
Desde el sitio de ISO puede comprar el norma completa publicada. Aquí hay un resumen tomado del sitio ISO:
ISO/IEC 9899:2011 especifica la forma y establece la interpretación de los programas escritos en el lenguaje de programación C. especifica
- la representación de programas en C;
- la sintaxis y restricciones del lenguaje C;
- las reglas semánticas para interpretar programas en C;
- la representación de datos de entrada a ser procesados por programas C;
- la representación de datos de salida producidos por programas C;
- las restricciones y límites impuestos por una implementación conforme de C.
ISO/IEC 9899:2011 no especifica
- el mecanismo por el cual los programas C se transforman para su uso por un sistema de procesamiento de datos;
- el mecanismo por el cual los programas C son invocados para su uso por un sistema de procesamiento de datos;
- el mecanismo por el cual los datos de entrada se transforman para su uso por un programa C;
- el mecanismo por el cual los datos de salida se transforman después de haber sido producidos por un programa C;
- el tamaño o la complejidad de un programa y sus datos que excederán la capacidad de cualquier sistema de procesamiento de datos específico o la capacidad de un procesador en particular;
- todos los requisitos mínimos de un sistema de procesamiento de datos que es capaz de soportar una implementación conforme. ISO/IEC 9899:2011 está diseñado para promover la portabilidad de los programas C entre una variedad de sistemas de procesamiento de datos. Está destinado a ser utilizado por implementadores y programadores.
según un comentario de Larry Jones en comp.std.c, no hubo cambios significativos con respecto a N1569 (que es N1570 sin marcadores de cambio). Lo único que queda sin resolver es el valor de
__STDC_VERSION__
pero supongo que lo más natural será201112L
.– Jens Gusted
25 de diciembre de 2011 a las 21:52
Gracias por esa información, @JensGustedt. Por cierto, me vinculé a n1570 porque ese enlace es de acceso público; n1569 también se puede descargar, pero no directamente.
– JC Salomón
26 de diciembre de 2011 a las 19:47
@JohanBezem, ¿incluso se olvidaron de eso? Entonces podemos emitir el primer informe de defectos 🙂 Afortunadamente, esto usa solo números enteros, por lo que cualquier prueba contra
201100L
debería estar a salvo.– Jens Gusted
5 de enero de 2012 a las 7:24
@JensGustedt Acabo de eliminar mi propio comentario, dado que ya describiste la situación, no hay nada que agregar allí. Supongo que esto es normal para una ‘primera versión’, ya que el proceso ISO es bastante complicado y nunca se sabe si terminará antes de Navidad, pero debe proporcionar el documento final listo para la prueba. Supongo que será mejor que lo usemos como sugieres como
< 201100L
o>= 201101L
. Pero supongo que esto no se considera un defecto.– Johan Bezem
5 de enero de 2012 a las 7:29
También estoy leyendo el n1570 en detalle e investigando las diferencias entre este y el estándar final. Me concentro principalmente en la jerarquía de tipo final del lenguaje.
– Krzysztof Abramowicz
22 de enero de 2014 a las 18:19