En el post sobre copia de vectores, en los comentarios, se dice que la macro debería comprobar los tamaños pero… ¿es esto posible?
La respuesta es sí y es gracias al operador en tiempo de compilación sizeof.
Este operador devuelve el tamaño de un objeto o tipo en bytes. Así que podemos construir una macro muy sencilla que nos de el número de elementos de un vector:
#define vsize(v) (sizeof((v))/sizeof((v)[0]))
Ahora bien, muy importante, esta macro no funcionará con punteros. El tamaño de un puntero es el tamaño de la palabra (conjunto de bytes) usado para direccionar una posición de memoria: en máquinas de 32bits es de 4bytes y en máquinas de 64bits, de 8bytes. Así que nuestra macro no se comportará correctamente.
Con esto en mente se podría reescribir la macro de copia para que tuviese en cuenta el tamaño. La tenéis aquí y actualizada en la entrada original:
#define vsize(v) (sizeof((v))/sizeof((v)[0])) #define arraycp(type, target, source, offset, count)\ {\ int i, ts, ss, c;\ type *t; ts = vsize(target);\ type *s; ss = vsize(source) - offset;\ c = (count);\ for(i=0, t=(target), s=(source)+(offset);\ i<c && i<ts && i<ss;\ ++i, *t++=*s++)\ ;\ }
¿Comentarios, mejoras?