Incompatibilidad entre los códigos C y C++.




incompatibility (4)

El código C dado

#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 implementació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?


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


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

En C ++, por el contrario, las estructuras (y todos los demás nombres) viven en el espacio de nombres que rodea a la declaración, en lugar de un espacio de nombres de etiqueta de estructura separado como en C.

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

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


En C, no creo que pueda referirse a un tipo (es decir, struct x ) directamente usando solo su nombre. Tienes que 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.


En la declaración de clase C ++ struct x {}; introduce el nombre x en el alcance de la check y oculta x (declarado anteriormente como int en el alcance del archivo). Obtienes 1 como salida porque el tamaño de la clase vacía no puede ser cero en C ++ .

En C, una declaración de ámbito interno de un nombre de etiqueta de estructura nunca oculta el nombre de un objeto o función en un ámbito externo. Debe usar el nombre de etiqueta struct para referirse al nombre de tipo x (struct). Sin embargo, no puede tener una estructura vacía en C, ya que viola las restricciones sintácticas en la estructura (sin embargo, gcc lo admite como una extensión).





incompatibility