数组不是 R 值,因此您不能通过assignemnt 复制它们。但是你可以使用memcpy
#include <string.h>
void init(void)
{
memcpy(&myStruct,(tStruct[]) { {1, 2}, {3, 4}, {5, 6} }, sizeof(myStruct));
}
优化编译器生成的代码不应该比你得到的差多少
void init2(void)
{
myStruct[0] = (tStruct){1,2};
myStruct[1] = (tStruct){3,4};
myStruct[2] = (tStruct){5,6};
}
或者
void init3(void)
{
myStruct[0].a = 1, myStruct[0].b = 2;
myStruct[1].a = 3, myStruct[1].b = 4;
myStruct[2].a = 5, myStruct[1].b = 6;
}
Gcc 和 clang 能够很好地省略不必要的复合变量,例如直接分配单个组件。
https://gcc.godbolt.org/z/j9f37j
该memcpy
方法的最大缺点是它有点脆弱且类型不安全(如果违反了非强制类型兼容性,可能会导致越界读/写)。
如果你的 C 方言有 __typeof,那么通过一些宏技巧你应该几乎可以绕过这个 C 语言限制:
#include <string.h>
#define assignAnything(DestPtr,SrcPtr) ((void)((__typeof(SrcPtr)){0} = (__typeof(DestPtr)){0}) /*typecheck*/, memcpy(DestPtr, SrcPtr, sizeof(*(DestPtr))))
/* A Ptr-less version:
#define assignAnything2(Dest,Src) ((void)((__typeof(&(Src))){0} = (__typeof(&(Dest))){0}), memcpy(&(Dest), &(__typeof(Src)){Src}, sizeof(Dest)))
doesn't always work, unfortunately */
int main()
{
int d[3][2][1]={0};
int const s[3][2][1] = {0};
assignAnything(&d,&s); //works
#if NOPE
assignAnything(&s,&d); //will (correctly) compile-time fail because s has more qualifs (const) than d
#endif
}