LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1137|回复: 7

C语言的一个语法

[复制链接]
发表于 2009-10-5 22:38:20 | 显示全部楼层 |阅读模式
在定义一个接口的时候,经常使用如下的定义一个私有空间:
char priv[0];
还有的这样定义char priv[1];
请问它们有什么区别。
发表于 2009-10-6 14:20:27 | 显示全部楼层
  1. struct Package
  2. {
  3.   int size;
  4.   char data[0];
  5. };
  6. int size;
  7. ....
  8. struct Package *package = (struct Packet*)malloc(sizeof(struct Package)+size);
  9. ....
复制代码

然后你就可以操作package->data了
回复 支持 反对

使用道具 举报

发表于 2009-10-7 22:28:54 | 显示全部楼层
区别有二:

一:char priv[0] 这种格式在正规的编译器严格语法情况下会报错,是非法声明,为了保证代码的可移植性,应当避免。
二:char priv[1] 多浪费一个字节空间(实际浪费往往不止一个字节,因为结构体是字对齐的)。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2009-10-9 08:03:07 | 显示全部楼层
感谢楼上的!原来char priv[1]才是正确的声明呀!但是感觉又不对了!这和声明一个一维的字符数组没有区别吧!
回复 支持 反对

使用道具 举报

发表于 2009-10-9 09:18:34 | 显示全部楼层
linux内核里都是这样用的。
现在C99也支持了的。
Post by poet;2034020
区别有二:

一:char priv[0] 这种格式在正规的编译器严格语法情况下会报错,是非法声明,为了保证代码的可移植性,应当避免。
二:char priv[1] 多浪费一个字节空间(实际浪费往往不止一个字节,因为结构体是字对齐的)。
回复 支持 反对

使用道具 举报

发表于 2009-10-9 18:02:48 | 显示全部楼层
个人感觉,priv[0]要优于priv[1],当然,需要编译器的支持。
回复 支持 反对

使用道具 举报

发表于 2009-10-15 11:43:43 | 显示全部楼层
Post by tjpm;2034412
linux内核里都是这样用的。
现在C99也支持了的。


Linux 内核不需要考虑跨平台问题,它只要 gcc 能够编译就够了。

实际上 Linux 内核有很多 gnu 专用的扩展语法。用非 gcc 编译 linux 几乎是不可能的。

而你的程序如果希望在非 linux 平台中编译的话。。。可能不得不考虑放弃这些 gcc 专用的特性。

char var[0] 在 gcc 中当然没有问题,不过这不等于说在其他编译器或者修改编译选项时也没问题。
回复 支持 反对

使用道具 举报

发表于 2009-10-15 15:22:09 | 显示全部楼层
确实如你说的Linux内核有很多GCC专用的扩展语法,目前只听说有另外用intel c编译器编译出了linux内核。但是都是改过的。

不过上面不是说了零长数组进C99了么,在支持C99的编译器都支持的。
不信你试试icc之类的。

Post by poet;2036769
Linux 内核不需要考虑跨平台问题,它只要 gcc 能够编译就够了。

实际上 Linux 内核有很多 gnu 专用的扩展语法。用非 gcc 编译 linux 几乎是不可能的。

而你的程序如果希望在非 linux 平台中编译的话。。。可能不得不考虑放弃这些 gcc 专用的特性。

char var[0] 在 gcc 中当然没有问题,不过这不等于说在其他编译器或者修改编译选项时也没问题。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表