Estoy trabajando en algún código C++ para un sistema integrado. La interfaz de E/S que utiliza el código requiere que el tamaño de cada mensaje (en bytes) sea una potencia de dos. En este momento, el código hace algo como esto (en varios lugares):Rellenar una estructura C++ con una potencia de dos
#pragma pack(1)
struct Message
{
struct internal_
{
unsigned long member1;
unsigned long member2;
unsigned long member3;
/* more members */
} internal;
char pad[64-sizeof(internal_)];
};
#pragma pack()
Estoy intentando compilar el código en una de 64 bits de Fedora, por primera vez, donde long
es de 64-bits. En este caso, sizeof(internal_)
es mayor que 64, la expresión de tamaño de matriz se desborda y el compilador se queja de que la matriz es demasiado grande.
Idealmente, me gustaría poder escribir una macro que tome el tamaño de la estructura y evaluar en tiempo de compilación el tamaño requerido de la matriz de relleno para redondear el tamaño de la estructura a una potencia de dos.
He consultado la página Bit Twiddling Hacks, pero no sé si alguna de las técnicas allí realmente puede implementarse en una macro para ser evaluada en tiempo de compilación.
¿Alguna otra solución a este problema? ¿O debería perpetuar el problema y simplemente cambiar el mágico 64 a un mágico 128?
Me gusta esto, pero falla cuando el contenido es una potencia par de 2. La declaración de pad obtiene error C2466: no se puede asignar una matriz de tamaño constante 0 –
Buen punto. Corregido ahora. – fizzer
Supongo que puede derivar PossiblyPadded de T en lugar de tener un miembro T (para T adecuado) y ahorrarse la molesta sintaxis de acceso de miembro. – fizzer