2016-12-17 1258 views
7

我有两个C文件。C中的void和static void函数有什么区别?

file1.c中

int main() 
{ 
    func(); 
    return 0; 
} 

file2.c中

static void func(void) 
{ 
    puts("func called"); 
} 

但是,如果我用命令cc file2.c file1.c编译上面的代码中,我得到了下面,

undefined reference to `func' 
collect2: error: ld returned 1 exit status 

但是,如果我在file2.c中删除static关键字并用命令cc file2.c file1.c编译上面的代码,它成功运行。

所以,我有一个问题,在C中void和static void函数有什么区别?

+5

静态函数不能从任何其他编译单元中调用。除去static关键字,并且该函数可以从任何编译单元调用,因此程序将链接。 – Peter

+0

Peter的基本上是正确的,但是有一种高级场景,如果指向该函数的指针可用于其他文件中的代码,则静态函数可以由不同源文件中的代码调用。你可能不需要为此担心;你可能还需要了解有关函数的指针。严格的版本是“一个'static'函数不能通过其自己的翻译单元之外的代码调用_by name_”。 –

+0

@Jonathan Leffler:哇。我会回答这样的彼得,但是,你是对的。哦,我知道如何使用一个指针来运作,但是,我们并没有记住所有特定场景的黑客。另外,因为如果一个函数必须在外面调用,还有一个指针,我不会声明它是静态的。确定黑客,但请记住它是一个黑客,而不是“你必须学习如何使用指针来运行” – jurhas

回答

15

C中的void和static void函数有什么区别?

真正的问题应该是staticnon-static函数有什么区别? (返回类型void是无关紧要的,它可以是int或其他任何东西)。

static关键字有些过度使用。当它适用于功能时,表示该功能有internal linkage,即其范围限于translation unit(仅作为源文件)。

默认情况下,函数是非静态的并且具有外部链接。该功能可以被不同的源文件使用。

就你的情况而言,由于static func不能在其他源文件中使用,因此会出现错误。


什么时候应该使用static函数?

static函数通常用于避免更大项目中的名称冲突。如果您检查Linux内核源码,例如在drivers/net中,您会看到很多static void函数。驱动程序由不同的供应商开发,使用static函数确保他们可以按自己的方式命名函数,而不用担心与其他非相关驱动程序开发人员的名称冲突。

+1

非常感谢您的好评。 –

相关问题