« 汪达与巨像 | 返回首页 | 平安夜借机玩了一下 »

把结构定义成一个数组

今天读 freebsd 的源码时发现一个小技巧,经过同事指点,恍然大悟。原来 C 里面还是有好多东西自己不知道的啊。

typedef struct _jmp_buf { int _jb[_JBLEN + 1]; } jmp_buf[1];

这个是 setjmp.h 里的一行定义,把一个 struct 定义成一个数组。这样,在声明 jmp_buf 的时候,可以把数据分配到堆栈上。但是作为参数传递的时候则作为一个指针。这样和 c array 的表现一样了。

btw, 读 freebsd 的源码后,感觉头文件组织比 vc 的强太多了。

Comments

云大不提还没注意到还有这好处。确实相当Nice
For standard C code, the number of elements in an array must be positive. As a GNU C extension, the number of elements can be as small as zero. Zero-length arrays are useful as the last element of a structure which is really a header for a variablelength object: struct line { int length; char contents[0]; }; { struct line *this_line = (struct line *) malloc (sizeof (struct line) + this_length); this_line -> length = this_length; } 来自GNC C Manual的解释。
我原来写过一个求职的,在你辞职那个地方...今天百度jmp_buf 第一个就来了这里。。我觉的是缘分。
我原来写过一个求职的,在你辞职那个地方...今天百度jmp_buf 第一个就来了这里。。我觉的是缘分。
这种技巧只会带来维护的困难,相信编译器的工作吧,你们这些白痴。
typedef struct sm{ int size; char content[0];};这种用法我觉得主要是想节省内存消耗和字节对其。 这里的content不会分配空间。当写成typedef struct sm{ char size; char content[0];}; 时,这个结构的大小只有1。写成typedef struct sm{ char size; char c1; char c2; char content[0];}; 这个结构的大小是3,而不是对齐后的4字节。
刚好像明白了,一看这个 typedef struct sm{ int size; char content[0]; } ; 又糊涂了,能不能再解释一下啊?
还是不太明白,可否请云风讲的清楚一点,谢谢!!
typedef struct sm{ int size; char content[0]; } ; 这种在WINDOWS SDK里经常见到,的确常用。
应该说详细点,不然一些同学不大知道,特别对参数传递不大了解的。 _jmp_buf jmp_buf; 如果是这样声明压参数就会把结构中的内容全部压进去 _jmp_buf jmp_buf[1] 这样的话就是压jmp_buf的地址 等同上面那样的用 &jmp_buf 传参 好处在于写着方便 在堆栈使用内存好处是快 只需要移动esp 传参用地址好处也是快 特别对于大结构 并且可以修改原始内容 确实是有不少人用 还有这样一种用法 typedef struct sm{ int size; char content[0]; } ; 这个也蛮好用,不过会被警告 哈
能让写程序方便一点,就已经是很大的用处了。
这个小技巧只是让写程序方便一点吧......还是想不通有什么特别的大用处
多年没写 C 啊,转到 C++ 的时候还没用过这个技法。 这个方法典型的运用就是 jmp_buf,所有 C 编译器都可以认,否则标准的 longjmp 没办法实现。
老大你怎么搞的,写的东西越来越没落了,这不是c的惯用技法吗?
想了半天也没有明白,这样写有什么好处呢?云风能不能举个使用的例子?
加个引用或者->就很麻烦吗?这种语法,主流编译器都能认么?怀疑。

Post a comment

非这个主题相关的留言请到:留言本