C如何将静态函数的使用仅限于其文件?

时间:2012-07-23 14:05:18

标签: c assembly

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

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:12)

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

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

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

答案 2 :(得分:6)

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

答案 3 :(得分:2)

事实上,情况正好相反。当函数静态时,其名称将写入目标文件中的某个位置,然后链接器可以使用此函数将其他目标文件链接到该函数的地址。

当函数声明为static时,编译器根本不会将名称放在那里。