2008-11-20 20 views
10

El comentario a this answer me hizo preguntarme. Siempre he pensado que C era un subconjunto propio de C++, es decir, cualquier código C válido es código C++ válido por extensión. ¿Estoy equivocado sobre eso? ¿Es posible escribir un programa C válido que no sea código C++ válido?¿El código C todavía se considera C++?

EDITAR: Esto es realmente similar a, pero no es un duplicado exacto de this question.

+0

Proyecto de ley Especialicé el tema de la otra pregunta, porque el tema no era representativo de la pregunta. –

+0

Creo que tienes razón. El propósito de la pregunta (y las respuestas dadas) es lo suficientemente diferente como para mantenerlo abierto. –

Respuesta

27

En general, sí el código C se considera código C++.

Pero C no es un subconjunto propio en un sentido estricto. Hay un par de excepciones.

Aquí hay algunas cosas válidas en C que no son válidos en C++:

int *new;//<-- new is not a keyword in C 
char *p = malloc(1024); //void * to char* without cast 

Hay más ejemplos también, pero se entiende la idea.

Anteriormente escribí una respuesta más extensa en una pregunta similar here.

+1

¡Guau, dos minutos! Es como si estuvieras acechando esperando que alguien hiciera esa pregunta. :) –

+1

He estado refrescando sin parar durante 37 días, y finalmente lo has preguntado;) –

+0

Técnicamente compilan juntos (como se señaló anteriormente). Pero escribir el código C en un archivo C++ (también conocido como C con clases) no significa que sea C++. Los estilos para cada idioma son radicalmente diferentes, pasar de C a C++ es como aprender un nuevo idioma. Pasar de C++ a C es demasiado doloroso. –

2
typedef struct { 
    int a, b, c; 
} st; 

st s = { 
    .a = 1, 
    .b = 2, 
}; 

Este es el código C válido que no se compila en compiladores más C++. Por lo que sé, no forma parte de la especificación C++. Sin embargo, algunos compiladores C++ son "liberales" con ciertas partes del lenguaje y permiten cosas que no deberían, al igual que muchos faltan algunos matices que están en la especificación pero que casi nunca se usan.

+0

Creo que la razón por la que los compiladores aceptarán esto es si activa el indicador de compatibilidad C99, o no lo desactive . –

1

Creo que puede ser más correcto decir que ANSI C es un subconjunto de C++. No K & R C.

+0

K & R C (segunda edición sentada frente a mí) es ANSI C. –

+1

K & R C es el término coloquial para C estándar (K & R 1st Edn). –

+0

@Jonathan: Gracias. No sabía eso. –

5

Un par de otras cosas que son C válido, pero no en C++:

int func(); 
func(0,0); //Error in C++, but not in C 

Asimismo, no hay que subestimar el impacto de C++ que tienen varias palabras clave:

int new; //Obviously an error in C++ 
+0

Estoy bastante seguro de que su primer ejemplo es incorrecto. Comeau lo rechaza. Si proporciona una lista de parámetros, debe respetarla. Si deja la lista de parámetros en blanco, puede pasar los parámetros que desee. –

+0

Estás en lo correcto. Lo edité –

5

Una cosa que distingue a los dos aparte y surge en el día a día el desarrollo es el ligamiento y la creación de nombres de funciones. Una función C compilada con un compilador C no es accesible para C++ a menos que el prototipo esté marcado con extern "C".

7

unos cuantos más:

C permite que las llamadas recursivas a principal, C++ no

char foo[3] = "abc" es C legal, no en C++

sizeof('A') == sizeof(int) es cierto en C y falsa en C++

Hay incluso más cambios con C99

Editar: Encontré una publicación que enumera la mayoría de las diferencias.http://c-faq.com/misc/cplusplus.nr.html

resumen de por qué C no es adecuada subconjunto de C++:

  1. auto conversión de void * a cualquier objeto/tipo incompleto
  2. nuevas palabras clave (un número de estos)
  3. debido a struct s quedar con ámbito
  4. debido a struct etiquetas convertirse typedef s
  5. debido a ser prototipos
  6. requerido
  7. implícitas int reglas
  8. llamada recursiva a main
  9. Debido a // comentarios
  10. debido a los caracteres literales son de tipo char y no int etc.
+0

Interesante, no sabía acerca de los 3 de esos. ¿Tiene una referencia para C++ que no permite llamadas recursivas a main? g ++ solo se quejará si agrego el indicador -pedantic. –

+0

No puedo encontrar una referencia al mismo, solo recuerdo que esto surgió mucho en comp.lang.c cuando la gente buscaba ayuda con C/C++, lo que hizo que los clientes habituales se voltearan y gritaran "Son idiomas separados ! " –

+1

Tenga en cuenta que // está permitido en C99, que es el estándar C actual. –

12

También tenga en cuenta que el C99 añade varias características que no están permitidos en C++ (o solo son compatibles con las extensiones de proveedor), como los tipos de datos _Complex y _Imaginary integrados, variables-len gth arrays (matrices dimensionadas en tiempo de ejecución en lugar de tiempo de compilación), miembros flexibles de la matriz (matrices declaradas como el último miembro de una estructura que puede contener una cantidad no especificada de elementos) y más.

Para obtener una lista exhaustiva de las incompatibilidades entre C y C++, incluidos los cambios con C99, consulte http://david.tribble.com/text/cdiffs.htm.

Cuestiones relacionadas