在一个项目源代码中看到我见过下面的声明
static int *foo();
所以它将foo声明为返回指向int的指针的静态函数。所以在这里,我想问你们将函数声明为静态的目的是什么?
答案 0 :(得分:9)
函数的名称在声明它的翻译单元(源文件)之外是不可见的,并且不会与另一个源文件中的另一个函数foo
冲突。
通常,函数应该声明为static
,除非您特别需要从另一个源文件中调用它。
(请注意,只有名称不可见。它仍然可以通过指针从程序中的任何位置调用。)
答案 1 :(得分:2)
它可以防止其他翻译单元(.c文件)看到该功能。保持干净整洁。默认情况下,没有static
的函数为extern
(其他模块可见)。
答案 2 :(得分:2)
来自C99标准:
6.2.2标识符的链接
如果对象或函数的文件范围标识符声明包含存储类指定静态,则标识符具有内部链接。
和
在构成整个程序的翻译单元和库集中 具有外部链接的特定标识符的声明表示相同的对象或 功能。在一个翻译单元内,每个声明的内部声明 连接表示相同的对象或功能。每个声明的声明都没有 link表示一个独特的实体。
答案 3 :(得分:1)
将函数声明为static
会阻止其他文件访问它。换句话说,它只对声明它的文件可见; “本地”功能。
您还可以将C中的static
(函数声明关键字,而非变量)与面向对象语言中的private
相关联。
有关示例,请参阅here。
答案 4 :(得分:1)
将函数或全局变量标记为static
会使当前转换单元编译为目标文件时链接器不可见。
换句话说,它只在当前翻译单元中具有内部链接。如果不使用static
或明确使用extern
存储类说明符,则该符号具有外部链接。