是什么static做的是使人们无法申报和调用一个函数在其他模块中,无论是通过一个头文件或没有。
回想一下,C中包含的头文件只是文本替换:
// bar.c
#include "header.h"
int bar()
{
return foo() + foo();
}
// header.h
int foo(void);
Run Code Online (Sandbox Code Playgroud)
经过预处理成为
int foo(void);
int bar()
{
return foo() + foo();
}
Run Code Online (Sandbox Code Playgroud)
实际上,您可以删除header.h并仅用bar.c这种方式编写。同样,foo在两种情况下,的定义都不需要包含标头;包括它只是添加了对定义和声明foo是否一致的检查。
但是,如果您要将的实现更改foo为
static int foo()
{
// whatever
return 42;
}
Run Code Online (Sandbox Code Playgroud)
那么声明foo将在模块和头文件中停止工作(因为头文件只是被替换为模块)。或实际上,该声明仍然“有效”,但是它停止引用您的foo函数,并且当您尝试调用时,链接器会对此进行抱怨foo。
使用static它的主要原因是为了防止链接程序冲突:即使foo和bar都在同一个模块中,而在模块外没有其他东西调用foo,如果不是static,它仍然会与其他任何static称为的非函数冲突foo。第二个原因是优化:当一个函数是时static,编译器确切地知道程序的哪个部分调用该函数以及使用哪些参数,因此它可以执行常量折叠,消除无效代码和/或内联。
| 归档时间: |
|
| 查看次数: |
2340 次 |
| 最近记录: |