我有两个 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函数有什么区别?
答案 0 :(得分:27)
C中的void和static void函数有什么区别?
真正的问题应该是static
和non-static
功能之间的区别是什么? (返回类型void
无关紧要,可以是int
或其他任何内容。
static
关键字有点过度使用。当它适用于函数时,意味着该函数具有internal linkage,即其范围仅限于translation unit(仅作为源文件)。
默认情况下,功能是非静态的,并且具有外部链接。该功能可以由不同的源文件使用。
在您的情况下,错误会自行显示,因为static func
无法在其他源文件中使用。
何时应使用static
函数?
static
函数通常用于避免较大项目中的名称冲突。如果您检查Linux内核源代码,drivers/net
中的示例,您会看到许多static void
函数。驱动程序由不同的供应商开发,static
函数的使用确保他们可以按照自己的方式命名函数,而不必担心与其他非相关驱动程序开发人员的名称冲突。