2011-12-25 9 views
32

C1x se ha convertido en ISO/IEC 9899: 2011 también conocido como C11.Últimos cambios en C11

¿Alguien sabe qué cambios (si existen) hay en el estándar del April 2011 draft n1570?

ETA: Hay actas del Comité de Londres (marzo de 2011) (que debe incluirse en n1570) here, y de Washington, DC (octubre de 2011) here; Supongo que una lista de cambios aceptados en los minutos de DC debe cubrir las cosas.

+7

de acuerdo con un comentario de Larry Jones en comp.std.c no hubo cambios significativos desde N1569 (que es N1570 sin marcadores de cambio). Lo único que queda sin resolver es el valor de '__STDC_VERSION__', pero supongo que de forma más natural será' 201112L'. –

+0

Gracias por esa información, @JensGustedt. Por cierto, me vinculé con n1570 porque ese enlace es de acceso público; n1569 se puede descargar también, pero no directamente. –

+0

@JohanBezem, ¿incluso se olvidaron de eso? Entonces podemos emitir el primer informe de defectos :) Afortunadamente esto solo usa números enteros, por lo que cualquier cosa al probar contra '201100L' debería ser segura. –

Respuesta

11

me acabo de enterar hoy que hubo uno (un poco) cambio 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 operador sizeof, el operador _Alignof , o el unario & operador, o es una cadena literal utilizado para inicializar un array, una expresión que tiene el tipo "array type" es convertido a una expresión con tipo "puntero a tipo" que apunta al elemento inicial del objeto array y no es un valor l.

La inclusión de _Alignof ha producido un error, ya que la sintaxis de un unario-expresión permisos

_Alignof (type-name) 

pero no

_Alignof unary-expression 

El estándar C11 liberado corrige este error y vuelve a la fraseología C99:

excepto cuando es el operando del operador sizeof, o la unario & operador, o es una cadena literal utilizado para inicializar una matriz, una expresión que tiene el tipo "array de tipo" se convierte en una expresión con tipo "puntero a tipo" que apunta al elemento inicial del objeto de matriz y no es un valor l.

Más información: en un mensaje reciente a comp.std.c sobre las diferencias entre N1570 y el estándar liberado, Larry Jones, un miembro del comité de la ISO C, escribió:

Hay una número de ellos, pero la mayoría son solo cambios editoriales menores, cambios en el texto repetitivo, y barajando las cosas para mantener los poderes que sean felices. El mayor cambio fue eliminar _Alignof de un grupo de lugares que no debería haber sido agregado (basado en la noción errónea de que toma un tipo o una expresión como sizeof does cuando realmente solo toma un tipo): 6.3. 2.1p2, p3, p4, fn. sesenta y cinco; y 6.7.1 fn. 121.

Message-ID: <[email protected]>

Así es como se ve en the thread groups.google.com.

5

contestada por Jens Gustedt en los comentarios:

De acuerdo con un comentario de Larry Jones en comp.std.c no hubo cambios significativos desde N1569 (que es N1570 sin marcadores de cambio). Lo único que queda sin resolver es el valor de __STDC_VERSION__, pero supongo que de forma más natural será 201112L.

+3

La norma oficial de 2011 dejó '__STDC_VERSION__' y la opción' __STDC_LIB_EXT1__' incorrectamente definida. El primer Corrigendum técnico definido como '201112L'. –

2

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 respecto a la norma anterior (C99), como está escrito en el C11 Wikipedia article, son los siguientes:

La norma incluye varios cambios en las especificaciones del lenguaje y de la biblioteca C99, tales como:

  • alineación especificación (_Alignas especificador, _Alignof operador, aligned_alloc función, <stdalign.h> archivo de cabecera)
  • El _Noreturn función especificador
  • Expresiones de tipo genérico con la palabra clave _Generic. Por ejemplo, la macro siguiente cbrt(x) traduce en 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) 
    
  • apoyo Multithreading (_Thread_local especificador de clase de almacenamiento, <threads.h> cabecera que incluye la creación del hilo/funciones de gestión, mutex, variable de condición y funcionalidad de almacenamiento específica de subprocesos, así como el calificador de tipo _Atomic y <stdatomic.h> para el acceso a objetos ininterrumpidos).
  • Mejorado el soporte Unicode basado en el Informe C Unicode Técnica ISO/IEC TR 19769: 2004 (char16_t y char32_t tipos para el almacenamiento de UTF-16/UTF-32 datos codificados, incluyendo las funciones de conversión en <uchar.h> y la correspondiente cadena u y U literal prefijos, así como el prefijo u8 para literales codificados en UTF-8).
  • Eliminación de la función gets, desaprobada en la revisión estándar de lenguaje C anterior, ISO/CEI 9899: 1999/Cor.3: 2007 (E), a favor de una nueva alternativa segura, gets_s.
  • Interfaces de comprobación de límites (Anexo K).
  • Funciones de análisis (Anexo L).
  • Más macros para consultar las características de los tipos de coma flotante, con respecto a los números de coma flotante subnormales y la cantidad de dígitos decimales que el tipo puede almacenar.
  • Anónimo estructuras y uniones, útiles cuando uniones y estructuras están anidadas, p. 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 #if y #error, cuando el traductor entiende los tipos.
  • Un exclusivo modo de crear y abrir ("…x" sufijo) para fopen. Esto se comporta como O_CREAT|O_EXCL en POSIX, que se usa comúnmente para archivos de bloqueo.
  • La función quick_exit funciona como una tercera forma de finalizar un programa, con la intención de realizar al menos una mínima desinicializació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 dar el valor esperado si imaginary es infinito o NaN).

Desde el sitio ISO puede comprar el full published standard. Aquí hay un resumen tomado del sitio ISO:

ISO/IEC 9899: 2011 especifica el formulario y establece la interpretación de los programas escritos en el lenguaje de programación C. Especifica

  • la representación de los programas C;
  • la sintaxis y restricciones del lenguaje C;
  • reglas semánticas para interpretar programas C;
  • la representación de datos de entrada para ser procesados ​​por programas C;
  • la representación de los datos de salida producidos por los programas C;
  • las restricciones y límites impuestos por una implantación conforme de C.

ISO/IEC 9899: 2011 no especifica

  • el mecanismo por el cual los programas en C se transforman para su uso por un Data- sistema de procesamiento;
  • mecanismo mediante el cual se invocan los programas C para ser utilizados por un sistema de procesamiento de datos;
  • mecanismo mediante el cual los datos de entrada se transforman para ser utilizados por un programa en C;
  • mecanismo por el cual los datos de salida se transforman después de ser producidos por un programa en 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 sea 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.
+0

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