ivito
V2EX  ›  C

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

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

    注意:是结构体的声明,不是变量定义
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1387 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 20:49 · PVG 04:49 · LAX 12:49 · JFK 15:49
    ♥ Do have faith in what you're doing.