这是C的语法还是Linux的宏?

2013-01-20 11:11:12 +08:00
 Sherlockhlt
在看Linux内核相关的时候经常看到像这样子的结构体赋值:
struct fileOperation fops = {
.read = read,
.open = open,
};
这个语法好奇怪,在其他C程序中都没有见到过,是C的语法还是Linux的宏?
2318 次点击
所在节点    C
22 条回复
sNullp
2013-01-20 11:12:08 +08:00
是gcc特有的语法应该。
gDD
2013-01-20 11:15:06 +08:00
Sherlockhlt
2013-01-20 11:22:46 +08:00
@gDD
原来是C99语法,不过这种写法是应该避免还是应该使用?
gDD
2013-01-20 11:29:33 +08:00
@Sherlockhlt 说不好,我不是搞C的,既然你说Linux内核都在用,没有理由不用啊,看着多清晰。
sinxccc
2013-01-20 11:46:53 +08:00
@Sherlockhlt 归根结底还是一句套话:视项目视团队而定。
liuw
2013-01-20 11:50:10 +08:00
这么好的东西为什么不用?
ForgotFun
2013-01-20 12:16:31 +08:00
这是GCC的扩展。是内核中常用的赋值方法。
ForgotFun
2013-01-20 12:22:57 +08:00
#include <stdio.h>
#include <string.h>

void main (int argc, char **argv)
{
int size = atoi(argv[1]);

char buffer[size];

printf("sizeof buffer %d\n", sizeof(buffer));
}


在GCC中这程序也是合法。
wog
2013-01-20 12:48:05 +08:00
@ForgotFun 开玩笑吧,void main 在哪里都不合法
Sherlockhlt
2013-01-20 14:18:50 +08:00
@liuw
主要是怕兼容性不好
ForgotFun
2013-01-20 15:03:30 +08:00
@wog
int size = atoi(argv[1]);

char buffer[size];

这里两句才是重点。
Mutoo
2013-01-20 15:06:55 +08:00
@wog void main 在单片机里可以有。
sivacohan
2013-01-20 15:16:22 +08:00
没看明白重点。。。
有时候我也这么写啊。
kneep
2013-01-20 15:26:00 +08:00
这是GNU C的扩展Linux里面大量存在
fangzhzh
2013-01-20 15:57:54 +08:00
@sivacohan 骚年, 静态数组长度是变量. 以前的编译器,是编不过的^_^
dndx
2013-01-20 16:02:22 +08:00
@fangzhzh
@ForgotFun 这跟 GCC 有什么关系,VLA 是 C99 标准定义的。

https://en.wikipedia.org/wiki/Variable-length_array
ForgotFun
2013-01-20 16:11:53 +08:00
@dndx GCC 支持这个特性的时候,C99还没出来呢。
sivacohan
2013-01-20 16:29:59 +08:00
@fangzhzh 完了,C忘没了……
ssword
2013-01-20 16:49:57 +08:00
C99的语法
liuw
2013-01-20 21:07:17 +08:00
@Sherlockhlt

C99标准,编译器支持就没问题了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/58158

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX