V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Sherlockhlt
V2EX  ›  C

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

  •  
  •   Sherlockhlt · 2013-01-20 11:11:12 +08:00 · 2352 次点击
    这是一个创建于 4357 天前的主题,其中的信息可能已经有所发展或是发生改变。
    在看Linux内核相关的时候经常看到像这样子的结构体赋值:
    struct fileOperation fops = {
    .read = read,
    .open = open,
    };
    这个语法好奇怪,在其他C程序中都没有见到过,是C的语法还是Linux的宏?
    22 条回复    1970-01-01 08:00:00 +08:00
    sNullp
        1
    sNullp  
       2013-01-20 11:12:08 +08:00
    是gcc特有的语法应该。
    Sherlockhlt
        3
    Sherlockhlt  
    OP
       2013-01-20 11:22:46 +08:00
    @gDD
    原来是C99语法,不过这种写法是应该避免还是应该使用?
    gDD
        4
    gDD  
       2013-01-20 11:29:33 +08:00
    @Sherlockhlt 说不好,我不是搞C的,既然你说Linux内核都在用,没有理由不用啊,看着多清晰。
    sinxccc
        5
    sinxccc  
       2013-01-20 11:46:53 +08:00
    @Sherlockhlt 归根结底还是一句套话:视项目视团队而定。
    liuw
        6
    liuw  
       2013-01-20 11:50:10 +08:00
    这么好的东西为什么不用?
    ForgotFun
        7
    ForgotFun  
       2013-01-20 12:16:31 +08:00
    这是GCC的扩展。是内核中常用的赋值方法。
    ForgotFun
        8
    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
        9
    wog  
       2013-01-20 12:48:05 +08:00
    @ForgotFun 开玩笑吧,void main 在哪里都不合法
    Sherlockhlt
        10
    Sherlockhlt  
    OP
       2013-01-20 14:18:50 +08:00
    @liuw
    主要是怕兼容性不好
    ForgotFun
        11
    ForgotFun  
       2013-01-20 15:03:30 +08:00
    @wog
    int size = atoi(argv[1]);

    char buffer[size];

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

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

    C99标准,编译器支持就没问题了。
    BOYPT
        21
    BOYPT  
       2013-01-21 10:57:19 +08:00
    @ForgotFun 这些标准都是先出草案再正式标准的,gcc一般在出草案时候就实现了,比如现在的C++0x/C++11,都是gcc首先实现的。
    faywong
        22
    faywong  
       2013-01-21 22:13:59 +08:00
    Linux代码的很多特性都必须由gcc来支持,并且gcc在支持c语言最新标准上最及时。所以建议在Linux平台尽情使用。若是跨平台的项目/兼容过去的陈旧代码,请尽量不要使用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1082 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:12 · PVG 03:12 · LAX 11:12 · JFK 14:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.