c++ - saber - ¿Los miembros de datos forman un rango?
programa en c++ para saber si es mayor de edad (5)
En general, es una mala idea. Si desea tratar algunas variables como una matriz, debe declararlas como una matriz :)
Sin embargo, puede usar algunas instrucciones específicas del compilador para asegurarse de que no haya relleno entre los elementos, fi:
#pragma pack(push, 1)
struct X
{
int a, b, c, d, e;
};
#pragma pack(pop)
o
struct __attribute__((__packed__)) X
{
int a, b, c, d, e;
};
¿Puedo tratar miembros de datos consecutivos del mismo tipo que un rango? Por ejemplo:
struct X
{
int a, b, c, d, e;
};
X x = {42, 13, 97, 11, 31};
std::sort(&x.a, &x.a + 5); // kosher?
No hagas eso El compilador es libre de agregar rellenos entre los miembros de la estructura (y al final).
No, este es un comportamiento indefinido. Usted está tratando a xa
como el primer elemento de una matriz, que no lo es. Puede funcionar en algunas implementaciones, también puede atacar tu refrigerador;)
No, esto no es posible en C ++. Sería bastante difícil estandarizar; en este caso, la semántica es bastante simple, pero ¿y si la estructura fuera heterogénea?
Si esto es realmente algo que quieres hacer, conviértelo en una matriz, vector o similar.
Como han dicho otros, la norma no garantiza que los miembros se almacenen sin vacíos o cosas que causen problemas. (Y para empeorar las cosas, parecerá que funciona, hasta que lo compiles con un compilador diferente (versión de), o para otra arquitectura algunos meses o años más tarde, y por supuesto, no será fácil descubrir qué salió mal).