2011-03-19 7 views
17

El código C dadaIncompatibilidad entre C y C++ código

#include <stdio.h> 
int x = 14; 
size_t check() 
{ 
    struct x {}; 
    return sizeof(x); // which x 
} 
int main() 
{ 
    printf("%zu",check()); 
    return 0; 
} 

da 4 como salida en C en mi aplicación de 32 bits, mientras que en C++ el código

#include <iostream> 
int x = 14;  
size_t check() 
{ 
    struct x {}; 
    return sizeof(x); // which x  
} 
int main() 
{ 
    std::cout<< check(); 
    return 0; 
} 

salidas 1. ¿Por qué tanta diferencia?

+1

Posibles duplicados: http://stackoverflow.com/questions/3451266/understanding-sizeofchar-in-32-bit-c-compilers http://stackoverflow.com/questions/119123/why-isnt-sizeof-for -a-struct-equal-to-the-sum-of-sizeof-of-each-member – phooji

+2

@phooji: No, eso no es un duplicado. –

+0

@Saurabh: Puede que tenga razón, las preguntas no cubren exactamente el mismo terreno, pero creo que las respuestas son pertinentes (consulte la respuesta de Prasoon y también mi comentario a su respuesta). – phooji

Respuesta

25

En C++ declaración de la clase struct x {}; introduce el nombre x en el ámbito de check y oculta x (previamente declarados como int en el ámbito de archivo) . Obtiene 1 como salida porque size of empty class cannot be zero in C++.

En C, una declaración de ámbito interno de un nombre de etiqueta struct nunca oculta el nombre de un objeto o función en un ámbito externo. Debe utilizar el nombre de etiqueta struct para hacer referencia al nombre de tipo x (struct). Sin embargo, no puede tener una estructura vacía en C como it violates the syntactical constraints on struct (sin embargo, gcc lo admite como una extensión).

+3

+1, pero quizás se debería enfatizar el hecho de que en C++ 'struct x' solo oculta la variable porque' x' se declara en el ámbito externo. Si se declararan en el mismo ámbito, felizmente vivirían juntos * y * el comportamiento del 'sizeof' sería el mismo que para C. –

7

El código C le proporciona el tamaño de la variable global 'x', mientras que el código C++ proporciona el tamaño de la estructura vacía. para obtener el tamaño de la estructura x en el código C, el uso sizeof (struct x)

+0

Tiene razón sobre el tema del alcance, pero no es toda la historia. En particular, ahora la pregunta es: ¿por qué 'sizeof (struct x)' produce 0 en la versión C :) – phooji

+0

+1 por velocidad. !! –

+0

@phooji: estructura vacía en C es una violación de restricción. –

0

En C, no creo que pueda hacer referencia directamente a un tipo (es decir, struct x) utilizando solo su nombre. Debe crear un objeto de ese tipo y ejecutar sizeof sobre él.

En C++, sizeof cuando se aplica a un nombre de tipo, devuelve el tamaño de cualquier objeto de ese tipo.

7

En C, las etiquetas struct viven en un espacio de nombre separado, y debe usar la palabra clave struct para acceder a los nombres allí. Esta es la razón por la cual la expresión "typedef struct {} x" es tan popular en C: le permite esencialmente promover nombres de estructuras en el espacio de nombres global.

En C++, por el contrario, estructuras (y todos los otros nombres) viven en el espacio de nombres que rodea la declaración, en lugar de un espacio de nombres etiqueta struct separado como en C.

Como dijo Saurabh, el uso sizeof (struct x) en C, o use el truco typedef struct {} x para hacer que sizeof (x) funcione como en C++.

Como un beneficio adicional, el C++ productos de los programas 1, ya que los objetos de la clase de concreto deben tener un tamaño distinto de cero (de manera que diferentes objetos deben tener diferentes direcciones), por lo que el compilador ha rellenado la estructura con un valor carácter anónimo.