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

时间:2016-12-17 06:35:45

标签: c static

我有两个 C 文件。

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函数有什么区别?

1 个答案:

答案 0 :(得分:27)

  

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

真正的问题应该是staticnon-static功能之间的区别是什么? (返回类型void无关紧要,可以是int或其他任何内容。

static关键字有点过度使用。当它适用于函数时,意味着该函数具有internal linkage,即其范围仅限于translation unit(仅作为源文件)。

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

在您的情况下,错误会自行显示,因为static func无法在其他源文件中使用。

何时应使用static函数?

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