我试图了解静态函数的工作原理。我读到静态函数不能从另一个文件中调用,所以我在一个文件中创建了一个简单的函数,而不是从另一个文件调用它,看不到它是否可调用。它是,但它不应该。 这是我的第一个文件: 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;
}
作为输出我得到了这个:“静态函数被称为” 但我不应该怀疑?因为我不能从另一个文件中调用静态函数?我希望你理解我的问题。请原谅我糟糕的英语!
答案 0 :(得分:4)
你说:
我读到静态函数无法从另一个文件中调用
这几乎是正确的。它应该是:
无法从另一个翻译单元调用在一个翻译单元中定义的静态函数。
添加
#include <riko_driver.c>
在main.c
中,您正在翻译单位riko_driver.c
的{{1}}部分内容。
如果您希望main.c
中定义的static
函数无法在riko_driver.c
中使用,但您希望main.c
中定义的某些extern
函数可用来自riko_driver.c
,
main.c
函数声明的头文件riko_driver.h
。extern
中的#include "riko_driver.h"
代替main.c
。#include <riko_driver.c>
中使用#include "riko_driver.h"
,以便编译器检查一致性。riko_driver.c
和main.c
。riko_driver.c
和main.o
以制作可执行文件。答案 1 :(得分:4)
要说静态函数只能在文件中调用它实际上是一个快捷方式,即静态函数只在已经定义的翻译单元中具有可见性。在C术语中,我们说该函数的标识符具有内部链接。
如果您将文件包含到另一个文件中并编译源文件,您仍然只有一个翻译单元。