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

结构体声明前加 static 是什么意思

  •  
  •   ivito · 2015 年 7 月 22 日 · 4555 次点击
    这是一个创建于 3832 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如下声明,static是一种存储类型,但声明明显是不分配内存的,那static的作用是什么的。
    static struct node{
    int key;
    node *next;
    };
    11 条回复    2015-07-22 10:31:08 +08:00
    cosiner
        1
    cosiner  
       2015 年 7 月 22 日
    文件作用域吧
    hellogmh
        2
    hellogmh  
       2015 年 7 月 22 日
    跟static加在普通函数(C的普通函数,不是C++的类成员函数)一样,链接的时候不会被其他模块引用,限制了在文件作用域内。
    ivito
        3
    ivito  
    OP
       2015 年 7 月 22 日
    @cosiner
    @hellogmh
    那为什么在前边加个typedef就不行了呢,如下
    typedef static struct node{
    int key;
    node *next;
    };
    ivito
        4
    ivito  
    OP
       2015 年 7 月 22 日
    @cosiner
    @hellogmh
    写错了,重新写
    typedef static struct _node{
    int key;
    _node *next;
    }node;
    kkwezard
        5
    kkwezard  
       2015 年 7 月 22 日
    static不属于一个结构体的声明。你应该先typedef一个结构之后在用static修饰它的定义。
    kkwezard
        6
    kkwezard  
       2015 年 7 月 22 日
    用static修饰结构体定义是不对的。至少我这编译不通过的。
    townboy
        7
    townboy  
       2015 年 7 月 22 日
    二楼说的很有道理
    ivito
        8
    ivito  
    OP
       2015 年 7 月 22 日
    @kkwezard 在VS下确实忽略了static修饰符,我提供的代码在《算法:C语言实现》这本书的英文版第27页,估计是作者的笔误。
    kkwezard
        9
    kkwezard  
       2015 年 7 月 22 日
    @ivito vs貌似会忽略一些常见的错误。gcc下编译不通过。从字面上理解。用static修饰结构体的定义是没有意义的。实践中也不会这么用。个人拙见。
    ivito
        10
    ivito  
    OP
       2015 年 7 月 22 日
    @kkwezard 同意,static只对产生内存对象的定义起作用
    xylophone21
        11
    xylophone21  
       2015 年 7 月 22 日
    在.c里声明的结构体本身就无法被外部引用,所有二楼的说法应该是错误的。

    注意:是结构体的声明,不是变量定义
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2830 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 09:44 · PVG 17:44 · LAX 01:44 · JFK 04:44
    ♥ Do have faith in what you're doing.