Últimos cambios en C11

8 minutos de lectura

Ultimos cambios en C11
JC Salomón

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.

  • 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

1647534309 357 Ultimos cambios en C11
keith thompson

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.

Ultimos cambios en C11
JC Salomón

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.

  • El estándar oficial de 2011 se fue __STDC_VERSION__ y el opcional __STDC_LIB_EXT1__ definida incorrectamente. El primer Corrigendum técnico definía a ambos como 201112L.

    –Keith Thompson

    19 de marzo de 2013 a las 22:37

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 #errorcuando 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.

  • Esto ni siquiera intenta responder a la pregunta formulada, que no tiene nada que ver con las diferencias entre C11 y C99.

    –Mark Amery

    3 abr 2016 a las 17:53

  • Estoy de acuerdo con @MarkAmery. La pregunta era sobre las diferencias entre N1570 y el C11 final publicado.

    – AJM

    5 mayo 2021 a las 14:30

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad