2010-09-23 12 views
18

Duplicar posible:
“C subset of C++” -> Where not ? examples ?¿Qué impide que C++ sea un superconjunto estricto de C?

Soy consciente de que C++ no es un superconjunto estricto de C. ¿Qué características lenguaje C++ evitar de ser un superconjunto de C?

+0

Esta pregunta ha sido respondida 1000 veces, me gustaría ver una respuesta técnica que demuestre que simplemente no es posible, palabras clave y C99 a un lado ... –

+1

@Matt Joiner: ¿por qué dejar de lado a C99? – JeremyP

+1

@Matt: demostrar que * qué * no es posible? Por supuesto, cada programa C se puede refactorizar a C++ válido. Eso es bastante trivial, dado que ambos lenguajes están completos. –

Respuesta

39

El elefante en la habitación: el siguiente es válido C pero no es válido C++.

int typename = 1; 

Sustituya su palabra reservada de C++ favorita.

+5

¿Por qué se bajó esta votación? –

+4

El ejemplo más corto sería 'int new = 1;' – SheetJS

2

Uno desde la cima de mi cabeza - C++ no admite el valor predeterminado int.

+0

El tipo de devolución implícita tampoco está permitido en C, excepto antes de C99. –

19

C++ también no soporta arrays de longitud variable, donde:

int array[n]; 

es válido en C, pero no C++. Una versión de C++ de lo anterior sería:

int *array = new int[n]; 
    ... 
delete [] array; 
+0

Es posible que desee aclarar que 'n' es una variable, no una constante, de lo contrario sería válido en C++. –

+2

Reemplazaría 'new int []' and 'delete []' con 'std :: vector '. – fredoverflow

+0

¿Puedes explicar por qué es que puedes hacer lo primero en C? ¿Se asignaría 'array' en la pila de alguna manera, y qué pasaría si' n' fuera demasiado grande para eso? No conozco bien a C, y tengo curiosidad por saber qué está sucediendo exactamente allí. Se agregaron – notJim

7

ejemplo simple, considere esta declaración:

int f(); 

Esto es válido C, pero C no válida ++: f(3, 2, -5, "wtf");

Explicación: en C, int f() se trata como int f(...) (al menos en el primer sitio de llamadas). Declare como int f(void) si no desea que f tome los parámetros.

+4

No, 'int f()' no es realmente 'int f (...)', hay una gran diferencia semántica. En el primer caso, esto significa que no conozco los parámetros de esa función y en el primer encuentro de la llamada a la función, los tipos predeterminados utilizados como parámetros declaran la firma de esa función, las llamadas subsiguientes deben adherirse a ese prototipo implícito y el el compilador debe advertir si llama a la función con otros parámetros. Con la elipse no es el caso, cada llamada puede tener diferentes parámetros sin previo aviso. –

+0

@tristopia: Sea lo que sea, es realmente un * no hagas esto *. –

+0

Absolutamente, solo estaba picando, ya que hay una diferencia real pero sutil. Dicho esto, no he votado negativamente sobre tu contribución ya que el mensaje está principalmente bien. –

11

Hay una entrada especial wiki que resume una gran cantidad de problemas.

Cuestiones relacionadas