静态功能对另一个文件可见

时间:2014-12-22 17:55:46

标签: c

我试图了解静态函数的工作原理。我读到静态函数不能从另一个文件中调用,所以我在一个文件中创建了一个简单的函数,而不是从另一个文件调用它,看不到它是否可调用。它是,但它不应该。 这是我的第一个文件: riko_driver包含函数:

static void sfunc(void)
{
   puts("Static function has been called\n");
}

这是我的代码(main.c)从riko_driver.c调用函数

#include <stdio.h>
#include <stdlib.h>
#include <riko_driver.c>

int main(){
sfunc();
system("PAUSE");    
return 0;
}

作为输出我得到了这个:“静态函数被称为” 但我不应该怀疑?因为我不能从另一个文件中调用静态函数?我希望你理解我的问题。请原谅我糟糕的英语!

2 个答案:

答案 0 :(得分:4)

你说:

  

我读到静态函数无法从另一个文件中调用

这几乎是正确的。它应该是:

  

无法从另一个翻译单元调用在一个翻译单元中定义的静态函数。

添加

#include <riko_driver.c>

main.c中,您正在翻译单位riko_driver.c的{​​{1}}部分内容。

如果您希望main.c中定义的static函数无法在riko_driver.c中使用,但您希望main.c中定义的某些extern函数可用来自riko_driver.c

  1. 创建一个包含main.c函数声明的头文件riko_driver.h
  2. 使用extern中的#include "riko_driver.h"代替main.c
  3. #include <riko_driver.c>中使用#include "riko_driver.h",以便编译器检查一致性。
  4. 分别编译riko_driver.cmain.c
  5. 链接riko_driver.cmain.o以制作可执行文件。

答案 1 :(得分:4)

要说静态函数只能在文件中调用它实际上是一个快捷方式,即静态函数只在已经定义的翻译单元中具有可见性。在C术语中,我们说该函数的标识符具有内部链接

如果您将文件包含到另一个文件中并编译源文件,您仍然只有一个翻译单元。