如果函数声明不在头文件中,则是否需要static关键字?

Bob*_*ley 3 c static

如果函数声明不在头文件(.h)中,而仅在源文件(.c)中,那么为什么需要使用static关键字?当然,如果只在.c文件中声明它,那么其他文件就看不到它,因为您不应该#include .c文件,对吗?

我已经阅读了很多关于此的问题和答案(例如,herehere),但不能完全理解。

Fre*_*Foo 5

是什么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它的主要原因是为了防止链接程序冲突:即使foobar都在同一个模块中,而在模块外没有其他东西调用foo,如果不是static,它仍然会与其他任何static称为的非函数冲突foo。第二个原因是优化:当一个函数是时static,编译器确切地知道程序的哪个部分调用该函数以及使用哪些参数,因此它可以执行常量折叠,消除无效代码和/或内联。

  • extern对于所有函数原型都是隐式的 (2认同)