Can we have functions inside functions in C++?

后端 未结 12 2308
抹茶落季
抹茶落季 2020-11-22 14:51

I mean something like:

int main() 
{
  void a() 
  {
      // code
  }
  a();

  return 0;
}
12条回答
  •  猫巷女王i
    2020-11-22 15:38

    Modern C++ - Yes with lambdas!

    In current versions of c++ (C++11, C++14, and C++17), you can have functions inside functions in the form of a lambda:

    int main() {
        // This declares a lambda, which can be called just like a function
        auto print_message = [](std::string message) 
        { 
            std::cout << message << "\n"; 
        };
    
        // Prints "Hello!" 10 times
        for(int i = 0; i < 10; i++) {
            print_message("Hello!"); 
        }
    }
    

    Lambdas can also modify local variables through **capture-by-reference*. With capture-by-reference, the lambda has access to all local variables declared in the lambda's scope. It can modify and change them normally.

    int main() {
        int i = 0;
        // Captures i by reference; increments it by one
        auto addOne = [&] () {
            i++; 
        };
    
        while(i < 10) {
            addOne(); //Add 1 to i
            std::cout << i << "\n";
        }
    }
    

    C++98 and C++03 - Not directly, but yes with static functions inside local classes

    C++ doesn't support that directly.

    That said, you can have local classes, and they can have functions (non-static or static), so you can get this to some extend, albeit it's a bit of a kludge:

    int main() // it's int, dammit!
    {
      struct X { // struct's as good as class
        static void a()
        {
        }
      };
    
      X::a();
    
      return 0;
    }
    

    However, I'd question the praxis. Everyone knows (well, now that you do, anyway :)) C++ doesn't support local functions, so they are used to not having them. They are not used, however, to that kludge. I would spend quite a while on this code to make sure it's really only there to allow local functions. Not good.

提交回复
热议问题