在 C 的 header 中使用静态 vs 不包含函数
Using static vs not including function in header in C
我知道在函数声明之前 C 中的 static
关键字只允许声明它的文件使用该函数(编译单元,更准确地说)。我做了一些研究,发现已经回答了有关 , and what it does in detail 的问题,但我认为缺少一个问题:
static
关键字是否向程序添加任何内容,当没有其他函数声明但后面跟着它的定义时?
例如:
main.c
#include "foo.h"
int main () {
foo();
return 0;
}
foo.c
void foo2() {
return ;
}
void foo() {
return foo2();
}
foo.h
void foo();
如果 foo2()
声明为 static void
会有什么区别?
当我们有一个由多人编写的应用程序时,一个人定义了一个函数 square
来计算数字的数学平方,而另一个人定义了一个函数 square
来绘制一个正方形显示,然后,如果两个函数都没有用 static
定义,则链接程序可能会导致 multiple-definition 错误。当用static
定义函数时,不会出现这个multiple-definition错误,因为不会从多个目标文件中导出相同的名称。
如果整个程序中只有一个名字的定义,那么就不会出现这样的multiple-definition错误。但是,如果函数声明为 static
,编译器知道它不必导出定义。这意味着,如果编译器将函数“内联”到所有调用它的位置,它就不必为函数的单独实现发出汇编代码。 (内联函数是将其代码合并到调用它的地方的过程,而不是使用调用指令来调用函数。)
我知道在函数声明之前 C 中的 static
关键字只允许声明它的文件使用该函数(编译单元,更准确地说)。我做了一些研究,发现已经回答了有关
static
关键字是否向程序添加任何内容,当没有其他函数声明但后面跟着它的定义时?
例如:
main.c
#include "foo.h"
int main () {
foo();
return 0;
}
foo.c
void foo2() {
return ;
}
void foo() {
return foo2();
}
foo.h
void foo();
如果 foo2()
声明为 static void
会有什么区别?
当我们有一个由多人编写的应用程序时,一个人定义了一个函数 square
来计算数字的数学平方,而另一个人定义了一个函数 square
来绘制一个正方形显示,然后,如果两个函数都没有用 static
定义,则链接程序可能会导致 multiple-definition 错误。当用static
定义函数时,不会出现这个multiple-definition错误,因为不会从多个目标文件中导出相同的名称。
如果整个程序中只有一个名字的定义,那么就不会出现这样的multiple-definition错误。但是,如果函数声明为 static
,编译器知道它不必导出定义。这意味着,如果编译器将函数“内联”到所有调用它的位置,它就不必为函数的单独实现发出汇编代码。 (内联函数是将其代码合并到调用它的地方的过程,而不是使用调用指令来调用函数。)