C 使用静态函数的正确方法是什么?

C 使用静态函数的正确方法是什么?,c,function,call,C,Function,Call,我有这个代码,它是有效的,但我认为我做得不对。我有3个文件,main.c,init.c和init.h init.h文件如下所示(为了简单起见,我在本例中省略了预处理器指令): 而init.c文件如下所示: #include "init.h" void init(int param){ int cfg1 = firstCFG(1); int cfg2 = secondCFG(2); int cfg3 = thirdCFG(3); int cfg4 = fourtCFG(4

我有这个代码,它是有效的,但我认为我做得不对。我有3个文件,
main.c
init.c
init.h

init.h
文件如下所示(为了简单起见,我在本例中省略了预处理器指令):

init.c
文件如下所示:

#include "init.h"

void init(int param){
   int cfg1 = firstCFG(1);
   int cfg2 = secondCFG(2);
   int cfg3 = thirdCFG(3);
   int cfg4 = fourtCFG(4);
   int cfg5 = fifthCFG(5);
}

int firstCFG(int param){
   //do stuff
   return stuff;
}
int secondCFG(int param){
   //do stuff
   return stuff;
}
int thirdCFG(int param){
   //do stuff
   return stuff;
}
int fourthCFG(int param){
   //do stuff
   return stuff;
}
int fifthCFG(int param){
   //do stuff
   return stuff;
}
#include "init.h"

int main(int argc, char** argv) {

    init(0);

    //do stuff....
}
从我的
main.c
文件中,我这样称呼它:

#include "init.h"

void init(int param){
   int cfg1 = firstCFG(1);
   int cfg2 = secondCFG(2);
   int cfg3 = thirdCFG(3);
   int cfg4 = fourtCFG(4);
   int cfg5 = fifthCFG(5);
}

int firstCFG(int param){
   //do stuff
   return stuff;
}
int secondCFG(int param){
   //do stuff
   return stuff;
}
int thirdCFG(int param){
   //do stuff
   return stuff;
}
int fourthCFG(int param){
   //do stuff
   return stuff;
}
int fifthCFG(int param){
   //do stuff
   return stuff;
}
#include "init.h"

int main(int argc, char** argv) {

    init(0);

    //do stuff....
}
所以基本上,我只调用
init.c
-
init()中的一个函数和该文件中的其他函数是从该文件本身调用的。但是因为我在主文件中包含了
init.h
,所以我可以从main调用所有CFG函数,但我不想这样做。我希望
main.c
文件只看到
init()
函数和CFG函数是
init.c
的私有函数。所以我的问题是,正确的方法是什么

我最初的想法是将CFG函数
设置为静态的
,而不是
#在
main.c
中包含“init.h”
,因此只有
init()
是外部的。这也行得通,但编译器给了我警告:函数'init'的隐式声明
warning:implicit声明
我只把
void init(int参数)放进去init.h
中编码>原型。在init.c中将所有CFG函数设置为静态


您仍然需要CFG函数的原型(除非将
init()
移到末尾),但您可以在
init.c
中声明它们。或者,如果您不想从其他文件调用
CFG
函数,您可以将它们放在一个单独的
init_impl.h
文件中,该文件不可供模块用户使用,您在
init.h
中声明它们的理由是什么?奇怪的是,您询问了静态函数,但没有一个函数是
静态的。只需在
init.c
中将CFG函数更改为
static int*CFG(…)
,它们就不会在编译单元之外可见。(当然,这与在
init.h
中声明它们相矛盾,因此请删除它们,只保留
void init(int)
)如果没有函数的原型,并且它们不是
静态的
,您可能会得到编译器诊断
缺少声明。