0

在阅读一本关于机器指令和程序的书时,我遇到了一个特殊的点,它说汇编程序会扫描整个源程序两次。它在第一次通过/扫描期间建立一个符号表,并在第二次扫描期间将整个程序与其关联。汇编器需要以类似的方式为函数提供地址。
现在,既然汇编程序要通过程序两次,为什么要声明一个函数才能使用呢?汇编器不会从第一遍为函数提供地址,然后在第二遍将其与程序相关联吗?在这种情况下,我正在考虑 C 编程。

4

1 回答 1

1

简单的答案是 C 程序要求在使用之前声明函数,因为 C 语言被设计为由编译器一次性处理。它与汇编程序和函数地址无关。编译器需要知道符号的类型,无论是函数、变量还是其他东西,才能使用它。

考虑这个简单的例子:

int foo() { return bar(); }
int (*bar)();

为了生成正确的代码,编译器需要知道它bar不是函数,而是指向函数的指针。该代码仅在您将其放在extern int (*bar)();定义之前才有效,foo因此编译器知道什么是类型bar

虽然该语言在理论上可以设计为要求编译器使用两次传递,但这将需要对该语言的设计进行一些重大更改。需要两次通过也会增加编译器所需的复杂性,减少可以托管 C 编译器的平台数量。这在 C 语言最初被开发的那一天是非常重要的考虑,当时 64K (65,536) 字节的 RAM 是很多内存。即使在今天,也会对大型程序的编译时间产生显着影响。

请注意,通过支持隐式函数声明,C 语言确实允许你想要的东西。(在我上面的示例中,它发生在之前未声明foo时发生的情况。)但是,此功能已过时、受限且被认为是危险的。bar

于 2016-11-30T20:11:55.227 回答