c++ c dependencies standards language-lawyer

¿Cuál es la relación entre los estándares C y C++?



dependencies standards (3)

¿Cómo sabría de qué versión del estándar C depende el estándar C ++?

En C ++ 14, es ISO / IEC 9899: 1999 (más tres correcciones, por lo que C99 en esencia) como se indica en 1.2 [intro.refs] en N4140. En C ++ 98, era C90, en C ++ 17, probablemente sea C11, pero el estándar de C ++ siempre lo hará explícito.

Si miro el estándar C con referencia a C ++, ¿cómo podría saber si el área que estoy buscando ha sido anulada?

Si observa el estándar C ++, importa explícitamente las definiciones C menos restrict o cualquier comportamiento C que desee o realiza modificaciones explícitas.

Por lo general, leer buena documentación en lugar de la norma en sí le servirá muy bien.

Para abordar su pregunta inicial:

El autor cita del estándar C99 en la documentación de C ++. Es eso valido?

Sí porque

1 Las tablas 74 [contiene std::tolower , me], 75, 76, 77, 78 y 79 describen los encabezados <cctype> , <cwctype> , <cstring> , <cwchar> , <cstdlib> (conversiones de caracteres) y <cuchar> , respectivamente.
2 El contenido de estos encabezados debe ser el mismo que el de los encabezados de la Biblioteca C estándar <ctype.h> , <wctype.h> , <string.h> , <wchar.h> , y <stdlib.h> y el C Unicode TR header <uchar.h> , respectivamente, con las siguientes modificaciones [ninguna de ellas se aplica a std::tolower , me]:

21.8 [c.strings] en N4140

Estaba escribiendo esta respuesta y cité de http://en.cppreference.com/w/cpp/string/byte/tolower#Parameters

No es representable como char sin signo y no es igual a EOF, el comportamiento no está definido

Cuando fui a inspeccionar la edición que había agregado esta frase , encontré el comentario del autor:

No se pueden usar caracteres negativos firmados con ninguna función ctype.h por C99 7.4 / 1

El autor cita del estándar C99 en la documentación de C ++. Es eso valido? No pude encontrar nada sobre la definición de esta función en el estándar de C ++, así que debo suponer que es válida.

Pero esto me preocupa por 2 razones:

  1. ¿Cómo sabría de qué versión del estándar C depende el estándar C ++?
  2. Hay listas de las discrepancias entre C y C ++ en todas partes . Si miro el estándar C con referencia a C ++, ¿cómo podría saber si el área que estoy buscando ha sido anulada?

La edición es correcta y este texto en particular ha estado en el estándar desde C90.

De C90 4.3

El encabezado declara varias funciones útiles para probar y mapear caracteres. En todos los casos, el argumento es un int, cuyo valor debe ser representable como un carácter sin signo o debe ser igual al valor de la macro EOF. Si el argumento tiene otro valor, el comportamiento no está definido.

De C11 7.4 / 1

El encabezado declara varias funciones útiles para clasificar y mapear caracteres. En todos los casos, el argumento es un int, cuyo valor debe ser representable como un carácter sin signo o debe ser igual al valor de la macro EOF. Si el argumento tiene otro valor, el comportamiento no está definido.

Texto idéntico; C siempre ha sido así. Por lo tanto, no importa qué versión C use su versión C ++ particular, porque todas las versiones C son equivalentes.


Para la primera pregunta:

El estándar de C ++ enumera explícitamente el (los) estándar (s) C de los que depende en su sección de referencias normativas . Para C ++ 14, [intro.refs] 1.2 / 1 pasa a enumerar C 99:

  • ISO / CEI 9899: 1999, Lenguajes de programación - C
  • ISO / CEI 9899: 1999 / Cor.1: 2001 (E), Lenguajes de programación - C, Corrigéndum técnico 1
  • ISO / CEI 9899: 1999 / Cor.2: 2004 (E), Lenguajes de programación - C, Corrigéndum técnico 2
  • ISO / CEI 9899: 1999 / Cor.3: 2007 (E), Lenguajes de programación - C, Corrigéndum técnico 3

Para la segunda pregunta:

El estándar C ++ no incorpora implícitamente ninguna parte del estándar C; todas las referencias al estándar C son explícitas. Una buena fuente de información sobre dónde C ++ se desvía de C es el Anexo C, "Compatibilidad" del estándar C ++, particularmente C.1 [diff.iso].

Además, las referencias a la biblioteca estándar de C están dispersas en toda la descripción de la biblioteca estándar de C ++ (capítulos 17-30 en C ++ 14). De particular interés puede ser:

  • 17.2 [library.c], que describe la inclusión básica de la biblioteca estándar C
  • Capítulo 18 [language.support], que describe muchos de los encabezados <c:::> de la biblioteca estándar de C ++ (los que ofrecen la funcionalidad de biblioteca estándar de C).