【发布时间】:2021-12-25 20:41:09
【问题描述】:
我正在浏览 K&R C 的书,第 4.2 章说如下:
如果 atof 本身和 main 中对它的调用在同一个源文件中的类型不一致,编译器会检测到错误。但是,如果(更可能)atof 是单独编译的,则不会检测到不匹配,atof 将返回一个 double,main 将其视为 int,并且会产生无意义的答案。
我想亲眼看看如果我创建并不一致地使用他们描述的函数会发生什么:
main.c:
#include <stdio.h>
int floatFunction();
int main() {
int result = floatFunction();
printf("result: %d\n", result);
}
floatFunction.c:
float floatFunction() {
return 10;
}
重击:
$ gcc main.c floatFunction.c -o main
$ ./main
result: 0
$
无论我得到什么值 floatFunction 返回,我总是得到 0 结果。我还尝试使用-o3 进行编译,结果相同。我期待看到 10.0 的位模式被解释为 int 结果。为什么这没有发生?
另外,为什么编译过程没有通知我类型不匹配,我该如何保护自己在实际代码中不犯这样的错误?
【问题讨论】:
-
你必须在你的hello.c中声明来自单独编译单元的float floatFunction()才能使用它。
-
编译器一次只能看到一个翻译单元,它可以检查单个文件中类型不匹配的不一致。查看链接器:stackoverflow.com/questions/9072459/…
-
你应该看看反汇编看看发生了什么。
-
K&R 不可能知道每个编译器或语言版本会做什么,因为这是一个很大的移动目标。然后是 ISA,这无疑会引起您的困惑。
-
回答标题问题:A
0是垃圾。