在C或C++中是否可以在另一个内部创建一个函数?

mak*_*ake 12 c c++

如果C或C++中有可能,有人可以告诉我吗?

void fun_a();
//int fun_b();
...
main(){
   ...
   fun_a();
   ...
   int fun_b(){
     ...
   }
   ...
} 
Run Code Online (Sandbox Code Playgroud)

或类似的东西,例如函数内的类?

谢谢你的回复,

Pot*_*ter 30

哇,我很惊讶没有人说是的!自由函数不能嵌套,但函数和类通常可以.

void fun_a();
//int fun_b();
...
main(){
   ...
   fun_a();
   ...
   struct { int operator()() {
     ...
   } } fun_b;

   int q = fun_b();
   ...
}
Run Code Online (Sandbox Code Playgroud)

您可以为仿函数提供构造函数并将对本地变量的引用传递给本地变量.否则,它可以访问其他本地类型和静态变量.但是,本地类不能是模板的参数.

  • 请注意,C++ 0x(嗯,我慢慢开始讨厌所有那些"注意在C++ 0x中" - 注释)本地类型将从封闭函数派生出它们的链接,这样你就可以将它们放到模板中了参数列表:) (6认同)

Xor*_*lev 7

C++不支持嵌套函数,但是你可以使用boost :: lambda之类的东西.


ken*_*ytm 6

C - 是的,以gcc 作为扩展名.

C++ - 没有.


小智 5

不,但在C++ 0x中,您可以http://en.wikipedia.org/wiki/C%2B%2B0x#Lambda_functions_and_expressions,可能需要几年才能完全支持.在撰写本文时,该标准尚未完成.

-编辑-

如果您可以使用MSVC 2010.我成功运行了下面的代码

void test()
{
 []() { cout << "Hello function\n"; }();
 auto fn = [](int x) -> int { cout << "Hello function (" << x << " :))\n"; return x+1; };
 auto v = fn(2);
 fn(v);
}
Run Code Online (Sandbox Code Playgroud)

产量

Hello function
Hello function (2 :))
Hello function (3 :))
Run Code Online (Sandbox Code Playgroud)

(我>> c:\dev\loc\uniqueName.txt在项目工作参数部分写了并复制粘贴了这个结果)

  • @Mark:还要注意x可以是十六进制数,允许它跳到F. (2认同)

Ric*_*ick 5

你不能在C++中的另一个函数内创建一个函数.

但是,您可以创建一个本地类functor:

int foo()
{
   class bar
   {
   public:
      int operator()()
      {
         return 42;
      }
   };
   bar b;
   return b();
}
Run Code Online (Sandbox Code Playgroud)

在C++ 0x中,您可以创建一个lambda表达式:

int foo()
{
   auto bar = []()->int{return 42;};
   return bar();
}
Run Code Online (Sandbox Code Playgroud)