【C++小技巧】无需声明函数原型即可调用
用过C或C++的无不抱怨声明函数麻烦。有时我们在写只有一个模块的简单小程序,却要对其中的函数加以声明。否则只能使用当前函数之前的定义的。例如:
- C/C++ code
void Start(){ A();}void A(){ B();}void B(){ //...}就会提示:'A' : undeclared identifier。
当然,对于简单的程序,我们可以改变函数的位置来避免。但对于相互调用的函数,就行不通了。只得老老实实的声明函数原型。每当参数或返回类型有变化,还得同时修改两处,非常麻烦。
为了简化函数声明,这里利用C++的class定义和实现写一起的小技巧,避免了原型的定义:
- C/C++ code
struct DoSome{ static void Start(int i) { if(i > 0) A(i); } static void A(int j) { if(j > 0) B(j); } static void B(int k) { if(k > 0) Start(k); }};这样一来,每个函数都当作类的静态方法,并且定义和实现写在一起,就避免了手工去定义原型,并且能成功通过编译。
- C/C++ code
int main(){ DoSome::Start(0); return 0;}因为都是当前模块里使用的,所以无需考虑导出之类的问题。当我们需要调用Start方法时,只需DoSome::Start(...)即可。甚至可以写出类型Java的风格来:
- C/C++ code
class Test{public: static void Main(vector<string>& args) { cout << args[0] << endl; A(); } static void A() { B(); } static void B() { }};//------------------------------int main(int argc, char* argv[]){ vector<string> v; for(int i = 0; i < argc; i++) v.push_back(argv[i]); Test::Main(v); return 0;}//------------------------------由于C++不支持静态变量初始化,例如class中的static int i = 0;就无法通过编译,因此只能将其移到class之前定义。
[解决办法]
感谢分享。。。