问题描述
我学习的全局变量的行为。
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 ++:
- GCC:
有没有错误,编译和放大器;成功链接(这是意外对我来说)。经执行 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
.
海湾合作委员会给了我 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不?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!