我们班上有一个问题,如果我们在 .c 文件中将变量声明为 extern long,然后在另一个 .c 文件中将该变量定义为 double,会发生什么。
当我们尝试打印 long 变量时,我们显然得到了一个垃圾值或溢出值,我不确定(即它是一些负值 - 在每个人的设备中都相同,因此可能不仅仅是一个垃圾值)。
我想了解当我们这样做时编译器和链接器内部发生了什么。以及变量的内存如何最终产生垃圾值或溢出值。
我们还想获得定义为双精度的变量的整数部分。有没有办法在不匹配变量的 extern 声明 和 definition 类型的情况下做到这一点。
a.c 文件
#include<studio.h>
extern long x;
int main(){
printf("%ld", x);
return 0;
}
b.c 文件
double x = 3.1456;
正如@Barmar 提到的,这是未定义的行为。 C 2017 标准,见附件 J.5.11:
一个对象的标识符可能有多个外部定义,无论是否带有 显式使用关键字 extern;如果定义不一致,或者初始化了多个定义,则 行为未定义 (6.9.2)。
但我不清楚第 6.9.2 节是否这么说。