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

2013 年 1 月 20 日
 Sherlockhlt
在看Linux内核相关的时候经常看到像这样子的结构体赋值:
struct fileOperation fops = {
.read = read,
.open = open,
};
这个语法好奇怪,在其他C程序中都没有见到过,是C的语法还是Linux的宏?
3045 次点击
所在节点    C
22 条回复
sNullp
2013 年 1 月 20 日
是gcc特有的语法应该。
gDD
2013 年 1 月 20 日
Sherlockhlt
2013 年 1 月 20 日
@gDD
原来是C99语法,不过这种写法是应该避免还是应该使用?
gDD
2013 年 1 月 20 日
@Sherlockhlt 说不好,我不是搞C的,既然你说Linux内核都在用,没有理由不用啊,看着多清晰。
sinxccc
2013 年 1 月 20 日
@Sherlockhlt 归根结底还是一句套话:视项目视团队而定。
liuw
2013 年 1 月 20 日
这么好的东西为什么不用?
ForgotFun
2013 年 1 月 20 日
这是GCC的扩展。是内核中常用的赋值方法。
ForgotFun
2013 年 1 月 20 日
#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 年 1 月 20 日
@ForgotFun 开玩笑吧,void main 在哪里都不合法
Sherlockhlt
2013 年 1 月 20 日
@liuw
主要是怕兼容性不好
ForgotFun
2013 年 1 月 20 日
@wog
int size = atoi(argv[1]);

char buffer[size];

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

https://en.wikipedia.org/wiki/Variable-length_array
ForgotFun
2013 年 1 月 20 日
@dndx GCC 支持这个特性的时候,C99还没出来呢。
sivacohan
2013 年 1 月 20 日
@fangzhzh 完了,C忘没了……
ssword
2013 年 1 月 20 日
C99的语法
liuw
2013 年 1 月 20 日
@Sherlockhlt

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

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

https://study.congcong.us/t/58158

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

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

© 2021 V2EX