我正在研究全局变量的行为.
到目前为止,我认为全局变量的多重定义是一种非法方式,必须得到一个错误.但是我从Borland C/C++编译器得到了意想不到的结果,而GCC给了我预期的结果.
test1.c:
#include<stdio.h>
void func(void);
int num=1;
void main(){
func();
return;
}
Run Code Online (Sandbox Code Playgroud)
test2.c:
#include<stdio.h>
int num=2;
void func(){
printf("%d",num);
return;
}
Run Code Online (Sandbox Code Playgroud)
Borland C/C++:
c:\test>bcc32 test1.c test2.c
Run Code Online (Sandbox Code Playgroud)GCC:
c:\test>gcc test1.c test2.c
Run Code Online (Sandbox Code Playgroud)没有错误,编译和链接成功(对我来说这是意料之外的.)执行后test1.exe,控制台上打印出2.这是num定义的价值test2.c.
GCC给了我一个多重定义的错误num.当然,a.exe没有制作.(这是我所期待的)
为什么会这样?请告诉我.谢谢!
对象的多个外部定义是C中的未定义行为.一个常见的扩展是接受多个定义(如果它们没有不同意(通常具有相同类型且没有初始化值).
C99 6.9p5说:
如果在表达式中使用通过外部链接声明的标识符(而不是作为sizeof运算符的操作数的一部分,其结果是整数常量),则整个程序中的某个地方应该只有一个标识符的外部定义; 否则,不得超过一个"
和C99,4.p2:
在约束之外违反"应"意味着UB