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

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

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

    注意:是结构体的声明,不是变量定义
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1006 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 21:57 · PVG 05:57 · LAX 13:57 · JFK 16:57
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.