cod*_*nix 9 c struct data-structures
我需要通过互联网传输数据包,其长度应该是动态的.
struct packet
{
int id;
int filename_len;
char filename[];
};
Run Code Online (Sandbox Code Playgroud)
问题是零长度数组不符合ISO标准.
我应该用char filename[1];吗?但是sizeof(struct packet)不会再返回正确的值了.
我认为你应该看看动态大小结构的一些现有例子,以获得指导.我所知道的最好的例子是Win32中的TOKEN API.他们使用宏ANYSIZE_ARRAY,它只能解析为1.Raymond Chen做了一篇广泛的博客文章,详细说明了他们为什么这样做
至于诸如sizeof失败的操作.无论您为动态大小的结构选择何种解决方案,这都将失败.sizeof是一个编译时操作,您将在运行时重新调整结构大小.它根本无法工作.
经典问题.您可以简单地处理它(并注意,如果编译器将结构大小向上舍入(我相信)允许的话,sizeof(foo)可能会超过一个),或者您可以执行以下操作:
struct packetheader {
int id;
int filename_len;
};
struct packet {
struct packetheader h;
char filename[1];
};
Run Code Online (Sandbox Code Playgroud)
这很烦人(你必须使用h.id等),但它确实有效.通常我只是处理它是一个,但上面可能稍微更便携.