C 使用静态函数的正确方法是什么?
我有这个代码,它是有效的,但我认为我做得不对。我有3个文件,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
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)
)如果没有函数的原型,并且它们不是静态的,您可能会得到编译器诊断缺少声明。