这里提供一种解决方案,用于连接两个或多个静态分配的数组。静态分配的数组是在编译时定义长度的数组。sizeof运算符返回这些数组的大小(以字节为单位):
char Static[16];
int n = sizeof(Static_array);
我们可以使用运算符
sizeof
来构建一组宏,这些宏将连接两个或多个数组,并可能返回总数组长度。
我们的宏:
#include <string.h>
#define cat(z, a) *((uint8_t *)memcpy(&(z), &(a), sizeof(a)) + sizeof(a))
#define cat1(z, a) cat((z),(a))
#define cat2(z, a, b) cat1(cat((z),(a)),b)
#define cat3(z, a, b...) cat2(cat((z),(a)),b)
#define cat4(z, a, b...) cat3(cat((z),(a)),b)
#define cat5(z, a, b...) cat4(cat((z),(a)),b)
#define catn(n, z, a ...) (&cat ## n((z), a) - (uint8_t *)&(z))
使用示例:
char One[1] = { 0x11 };
char Two[2] = { 0x22, 0x22 };
char Three[3] = { 0x33, 0x33, 0x33 };
char Four[4] = { 0x44, 0x44, 0x44, 0x44 };
char All[10];
unsigned nAll = catn(4, All, One, Two, Three, Four);
然而,由于我们定义宏的方式,只要sizeof
返回它们的大小,我们就可以连接任何类型的对象。例如:
char One = 0x11;
char Two[2] = { 0x22, 0x22 };
char Three[] = "33";
struct {
char a[2];
short b;
} Four = { .a = { 0x44, 0x44}, .b = 0x4444 };
void * Eight = &One;
char All[18];
unsigned nAll = catn(5, All, One, Two, Three, Four, Eight);
使用常量字面值,我们可以使用这些宏来连接常量、函数结果甚至是常量数组:
cat2(All,(char){0x11},(unsigned){some_fct()},((uint8_t[4]){1,2,3,4}));
X
/Y
和total
分别分配了四个和八个 _字节_。 - Some programmer dude