c中的静态函数

fli*_*liX 2 c static

我认为C语言中声明为静态的函数只有在我定义的文件中才可见.在以下示例中,静态var在另一个文件中可见.我不太确定是否是因为包括:

main.c中:

#include "test.c"

int main() {
    test();
}
Run Code Online (Sandbox Code Playgroud)

test.c的:

static void test() {
    // do something here
}

void foo() {
   // do something different here
}
Run Code Online (Sandbox Code Playgroud)

如果它只使用头文件是不是完全没用呢?如果我想隐藏一个函数,那么我在头文件中没有提到它?!

sid*_*yll 7

#include是一个预处理器指令.当预处理器(在编译之前运行)看到它时,它将在那里复制包含文件的内容.所以你最终在同一个文件中.

如果它只使用头文件不是它完全没用吗?如果我想隐藏一个函数然后我不在头文件中提到它?!

当然,但在头文件中没有提到它不会"隐藏"它.头文件未编译,如果您将原型放在那里,它将作为编译器的线索.

静态函数的优点是它们在文件外部不可见 - 因为它在目标文件中不是全局的.这允许您在其他文件中使用相同的符号(名称)作为另一个东西,而不会发生冲突.


K-b*_*llo 5

C中声明为静态的函数仅在包含的转换单元中可见,这意味着该符号不会被导出.它与文件无关,但与翻译单元无关.在你的情况下,有一个单独的翻译单元是main.c,它包含另一个文件的内容,因此定义main,test和foo; main和foo将导出,而测试则不会.