我做了一些研究,但未能找到明确的批准或反对。
我想要的是一个固定大小的结构+可变长度的部分,这样序列化可以用简单且不易出错的方式表达。
struct serialized_data
{
int len;
int type;
char variable_length_text[0];
};
然后:
serialize_data buff = (serialize_data*)malloc(sizeof(serialize_data)+5);
buff->len=5;
buff->type=1;
memcpy(buff->variable_length_text, "abcd", 5);
不幸的是,我无法找到MSVC,GCC,CLang等等。
也许有更好的方法来实现同样的目标?
我真的不想要那些丑陋的演员:
memcpy((char*)(((char*)buffer)+sizeof(serialize_data)), "abcd", 5);
答案 0 :(得分:2)
该程序使用零长度数组。这不是C而是GNU扩展。
http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
C89中的一个常见习语,称为 struct hack ,用于:
struct serialized_data
{
int len;
int type;
char variable_length_text[1];
};
不幸的是,它作为灵活阵列的常见用途并不严格符合要求。
C99附带类似于执行相同任务的东西:一个名为灵活数组成员的功能。 以下是标准(C99,6.7.2.1p17)
的一个例子struct s { int n; double d[]; };
int m = 12; // some value
struct s *p = malloc(sizeof (struct s) + sizeof (double [m]));