xdlailai
V2EX  ›  问与答

问一个 C 语言中全局变量的问题~

  •  
  •   xdlailai · Jan 29, 2018 · 2350 views
    This topic created in 3047 days ago, the information mentioned may be changed or developed.
    我有一个.h 文件,文件中定义一个全局变量 int a ;
    两个 C 文件都包含这个.h 文件,最后编译不会报重复定义的错,而且可以正常工作。
    如果我把 h 文件里的 int a ;改为 int a=1;就可以报出重复定义的错。
    搜索了半天,也没找到为啥。v 友帮解释下吧~多谢。
    11 replies    2018-01-29 18:47:23 +08:00
    jiutai21
        1
    jiutai21  
       Jan 29, 2018
    声明与定义的区别吧
    ovear
        2
    ovear  
       Jan 29, 2018
    LZ 是不是再找 extern
    sbw
        3
    sbw  
       Jan 29, 2018
    with the exception that uninitialized variables tentatively go in the common (or bss) section and can be multiply "defined".

    https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Variable-Attributes.html
    xdlailai
        4
    xdlailai  
    OP
       Jan 29, 2018
    @sbw 我也查到这个,说不初始化的变量会定义到 bss 段。但是还不是太理解
    sbw
        5
    sbw  
       Jan 29, 2018
    ysc3839
        6
    ysc3839  
       Jan 29, 2018 via Android
    定义了没使用,编译器就没编译吧?
    xdlailai
        7
    xdlailai  
    OP
       Jan 29, 2018   ❤️ 2
    @xdlailai
    找到答案了。
    首先,所有的全局符号,在链接器这当做两类看待:a )强符号; b )弱符号。
    强符号包括:已经初始化的全局变量(初始化和赋值是不同的,注意区分)、函数名;
    弱符号包括:没有初始化的全局变量。
    接着,链接器根据不同的符号组合,有不同的处理方式:
    a )强符号之间冲突,直接报错,链接失败。
    b )强符号与弱符号之间冲突,强符号覆盖弱符号。
    c )弱符号之间冲突,链接器会自己选一个来覆盖其他符号,选择方式各编译器不同。
    MyPassWordis
        8
    MyPassWordis  
       Jan 29, 2018
    “两个 C 文件都包含这个.h 文件,最后编译不会报重复定义的错,而且可以正常工作。”

    g++ 4.4 > multiple definition

    - - 楼主编译器用的什么
    xdlailai
        9
    xdlailai  
    OP
       Jan 29, 2018
    @MyPassWordis gcc。。我也诧异为啥不报错。。以为肯定报错的。看来编译器之间差异不小。
    chinawrj
        10
    chinawrj  
       Jan 29, 2018 via Android
    show me the code.你的眼睛或者描述肯定忽略了某些东西
    monlite
        11
    monlite  
       Jan 29, 2018
    你没有弄清楚定义和声明的区别。int a 相当于 extern int a,仅仅是声明,可以出现多次。而 int a = 1 是定义,只能出现一次。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1004 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 53ms · UTC 22:08 · PVG 06:08 · LAX 15:08 · JFK 18:08
    ♥ Do have faith in what you're doing.