8

我知道 C 中的静态函数只允许在该文件的范围内调用该特定函数。我感兴趣的是这是如何发生的。它是被放置到内存的特定部分还是编译器对该函数应用特定操作。可以将相同的过程应用于汇编中的函数调用吗?

4

4 回答 4

14

声明一个函数static并不能真正阻止它被其他翻译单元调用

static它的作用是防止该功能被其他翻译单元按名称引用链接)。这将消除直接调用该函数的可能性,即“按名称”调用。为此,编译器只需从从翻译单元导出的外部名称表中排除函数名称。除此之外,静态函数绝对没有什么特别之处。

您仍然可以通过其他方式从其他翻译单元调用该函数。例如,如果您以某种方式获得了指向static其他翻译单元中的函数的指针,则可以通过该指针调用它。

于 2012-07-23T14:11:59.207 回答
12

它不会进入对象的名称表,这会阻止它链接到其他东西。

于 2012-07-23T14:06:56.193 回答
6

函数和其他名称作为符号导出到目标文件中。链接器使用这些符号在链接时解析各种悬空引用(例如,调用另一个文件中定义的函数)。当您声明它时static,它不会作为符号导出。因此它不会被任何其他文件拾取。如果你有一个指向它的函数指针,你仍然可以从另一个文件中调用它。

于 2012-07-23T14:07:56.310 回答
2

事实上恰恰相反。当一个函数不是静态的时,它的名字写在目标文件的某个地方,链接器可以使用它来链接使用这个函数的其他目标文件,到那个函数的地址。

当函数被声明static时,编译器根本不会把名字放在那里。

于 2012-07-23T14:07:59.853 回答