当强符号和弱符号具有不同的数据类型时,会选择其数据类型吗?

时间:2016-07-21 17:37:59

标签: c linker

如果我有两个不同的C文件 -

main.c

void f(void);
int x = 38;
int y = 39;

int main()
{
 f();
 printf("x = %d\n", x);
 printf("y = %d\n", y);
 return 0;
}

swap.c

double x;
void f()
{
 x = 42.0;
}

我的问题是因为int x是这里更强的符号,不应该' t" x"被初始化为一个int,当调用函数f时,x = 42.0只会存储x只有42.但是x变为0,因为double被写入int。

当程序运行时,在链接两个文件后,我们得到此输出

x = 0 y = 1078263808

1 个答案:

答案 0 :(得分:4)

这两个文件中x的两个声明的“强度”没有区别。但是,声明不同并且x在两个文件中都有外部链接这一事实使得将两者链接成一个可执行的未定义行为。

正如您所看到的,结果是该程序不会产生合理的输出。

在典型的C实现中,链接器不会注意到这样的声明不匹配,并且C标准不需要发出诊断消息。但它仍然是一个无效的程序。

强制性标准参考:

§6.2.7兼容类型/第2段:

  

引用同一对象或函数的所有声明都应具有兼容类型;否则,行为未定义。

§5.1.1.3诊断/第1段:

  

符合要求的实现应至少生成一条诊断消息... [如果]翻译单元包含违反任何语法规则或约束的内容......在其他情况下无需生成诊断消息