我知道C中的静态函数允许只在该文件的范围内调用该特定函数。我感兴趣的是这是怎么发生的。它是放在内存的特定部分还是编译器对该函数应用特定操作。可以将相同的过程应用于汇编中的函数调用吗?
答案 0 :(得分:12)
它不会进入对象的名称表,这会阻止它被链接到其他东西。
答案 1 :(得分:12)
声明一个函数static
并不能真正阻止它被其他翻译单元调用。
static
的作用是阻止该功能按名称从其他翻译单元引用(链接)。这将消除直接调用该函数的可能性,即“按名称”调用。为此,编译器只是从翻译单元导出的外部名称表中排除函数名称。除此之外,静态函数绝对没有什么特别之处。
您仍然可以通过其他方式从其他翻译单元调用该功能。例如,如果您以某种方式在其他翻译单元中获得了指向static
函数的指针,则可以通过该指针调用它。
答案 2 :(得分:6)
函数和其他名称在对象文件中导出为符号。链接器使用这些符号在链接时解析所有类型的悬空引用(例如,调用另一个文件中定义的函数)。当您声明它static
时,它不会被导出为符号。因此,它不会被任何其他文件拾取。如果你有一个函数指针,你仍然可以从另一个文件中调用它。
答案 3 :(得分:2)
当函数声明为static
时,编译器根本不会将名称放在那里。