外部声明和定义类型区别

问题描述 投票:0回答:1

我们班上有一个问题,如果我们在 .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;
c type-conversion extern
1个回答
0
投票

正如@Barmar 提到的,这是未定义的行为。 C 2017 标准,见附件 J.5.11:

一个对象的标识符可能有多个外部定义,无论是否带有 显式使用关键字 extern;如果定义不一致,或者初始化了多个定义,则 行为未定义 (6.9.2)。

但我不清楚第 6.9.2 节是否这么说。

© www.soinside.com 2019 - 2024. All rights reserved.