2010-09-08 17 views
7

Duplicar posibles:
Why are C character literals ints instead of chars?C y C++ diferencia en sizeof ('x')

¿Por qué cuando se utiliza C hace sizeof('x') de retorno 4, pero sizeof('x') en C++ devuelve 1?

C++ normalmente se esfuerza por ser nada más que un superconjunto de C, ¿por qué los dos resultados divergen?

Editar Solo aclaración adicional. Esto parece ser un movimiento deliberado por parte del comité de estándares y supongo que no se habría hecho cambiar el tamaño de 'x' sin una buena razón. Estoy interesado en cuál es el motivo.

+2

Más o menos una duplicado de [Diferentes tamaños de resultados] (http://stackoverflow.com/questions/49046/different-sizeof-results), [¿Por qué los literales de caracteres C son en vez de caracteres?] (http://stackoverflow.com/questions/ 433895 /) y [Entendiendo sizeof (char) en compiladores C de 32 bit] (http://stackoverflow.com/questions/3451266/) y quizás uno o dos ot suyo. Se encontró con http://stackoverflow.com/search?q=[c]+[c%2B%2B]+sizeof+character+literal. – dmckee

+0

ninguno de los duplicados explica por qué. – doron

+0

@deus: es solo una decisión de diseño. La forma "c" significa que el compilador tiene que tomar menos decisiones sobre la promoción de tipo (porque "la promoción" ocurre cada vez) que puede haber jugado un rollo: las máquinas de principios de los años setenta eran lentas y tenían memoria limitada, por lo que eran simples compiladores una necesidad – dmckee

Respuesta

16

citar el C++ estándar ISO 14882: 2003, anexo C.1.1 cláusula 2.13.2

Cambio: Tipo de carácter literal se cambia de int a char

Fundamento: Esto es necesario para una coincidencia de tipo de argumento de función sobrecarga mejorada. Por ejemplo:

int function(int i); 
int function(char c); 
function(’x’); 

Es preferible que esta llamada partido la segunda versión de la función en lugar de la primera

(anexo C describe las incompatibilidades entre C y C++)

+0

Más o menos lo que pensaba pero agradable de ver en blanco y negro. – doron

+0

Por supuesto, ellos * podrían * haber introducido una sintaxis "' char' literal ", por ejemplo,' C'x'' es de tipo 'char', de la misma manera que' L'x'' es de tipo 'wchar_t '. – caf

+0

Nota, un literal de múltiples caracteres, por ejemplo, ''abcd'' * es * todavía de tipo' int', con valor definido por la implementación. – Potatoswatter

5

Porque es C, 'x' es en realidad un int, mientras que en C++ es un char.

C++ intenta es endurecer la tipificación estricta que era un poco floja en C.

+0

Comportamiento intrigante ... No soy muy C, pero esto me sorprende. Así que cuando llamas a 'printf ("% c ", 'x');', 4 bytes son empujados a la pila para los varargs, pero en C++ solo serían 1 byte? ¿Cómo podría funcionar eso, teniendo en cuenta que el CRT no sabe qué idioma lo está llamando? – tenfour

+0

+1, ¡está en la especificación! –

+4

@tenfour, nope - 4 bytes también se envían en C++. Las llamadas varargs tienen muchas reglas de promoción tipo. –

7

C++ no es un superconjunto de C. En particular, si se utilizan las versiones "actuales" - un compilador de C++ 0x modo se ahogo en el código C99.

+0

Pero eso se debe a que el (entonces) nuevo estándar C99 no se incorporó en C++ – doron

+0

@ deus-ex C99 estuvo fuera durante años antes de que se iniciara C++ 0x. Si quisieran hacer de C un subconjunto, habrían incluido los cambios. De hecho, sí incluyeron algunos de ellos. '#include ' hace referencia a 'stdint.h' de C99. – kwatford

+0

C y C++ han estado divergiendo ligeramente con versiones recientes de estándares. No esperaría que C99 se enrolle en C++ 0x o viceversa, con respecto a los conjuntos de características comunes. –