为什么Borland公司在不同的C文件同一个对象的多个定义而编制

为什么Borland公司在不同的C文件同一个对象的多个定义而编制

本文介绍了为什么Borland公司在不同的C文件同一个对象的多个定义而编制GCC不?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我学习的全局变量的行为。

I am studying the behavior of global variables.

到目前为止,我还以为全局变量的多个定义是非法的方式,
而且必须得到一个错误。但我得到了一个意想不到的结果,从Borland的C / C ++编译器,而GCC给了我预期的结果。

So far , I thought the multiple definition of global variables is an illegal way ,and must get an error. But I got an unexpected result from Borland C/C++ compiler , while GCC gave me the expected result.

test1.c

#include<stdio.h>

void func(void);

int num=1;

void main(){
    func();
    return;
}

test2.c中

#include<stdio.h>

int num=2;

void func(){
    printf("%d",num);
    return;
}

在MS-DOS提示符


  • Borland的C / C ++:

    On MS-DOS prompt

    • Borland C/C++ :

      c:\test>bcc32 test1.c test2.c
      


    • GCC:

    • GCC :

      c:\test>gcc test1.c test2.c
      



      • Borland的C / C ++:

      有没有错误,编译和放大器;成功链接(这是意外对我来说)。经执行 test1.exe ,2在控制台上打印。这是 test2.c中定义 NUM 的价值。

      There's no error and compile&link successfully(This is unexpected for me).After executing test1.exe , 2 was printed on the console. This is num's value defined in test2.c.


      • GCC:

      海湾合作委员会给了我 NUM 的多个定义的一个错误。当然, A.EXE 不是的。(这是我所期待的)

      GCC gave me an error of multiple definition of num. Of course , a.exe was not made.(This is what I was expecting)

      为什么会发生呢?
      请告诉我。
      谢谢!

      Why does that happen?Please let me know.Thank you!

      推荐答案

      对象的多个外部定义为C中的常见的扩展不确定的行为被接受多个定义,如果他们不同意(通常使用同一类型和无初始值)。

      Multiple external definitions of an object is undefined behavior in C. A common extension is to accept multiple definitions if they don't disagree (usually with same type and no initialization value).

      C99 6.9p5说:

      C99 6.9p5 says:

      如果有外部链接声明的标识符在离pression使用(除了作为sizeof操作符,其结果是一个整型常量的操作数的一部分),地方整个程序应当有只有一个外部定义为所述标识符;否则,应不超过一个

      和C99,4.p2:

      违反应当约束之外意味着UB的

      这篇关于为什么Borland公司在不同的C文件同一个对象的多个定义而编制GCC不?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

09-03 06:11