首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

【C++小技能】无需声明函数原型即可调用

2012-11-13 
【C++小技巧】无需声明函数原型即可调用用过C或C++的无不抱怨声明函数麻烦。有时我们在写只有一个模块的简单

【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之前定义。

[解决办法]
感谢分享。。。

热点排行