在块范围内使用C ++ 11函数声明的情况?

时间:2013-05-23 01:32:06

标签: c++ c++11

似乎我可以在块范围内声明一个函数:

int main()
{
    void f(); // OK
}

但是我无法定义它:

int main()
{
    void f() {}; // ERROR
}

我的问题是,块范围内的函数声明有什么用?什么是用例?

2 个答案:

答案 0 :(得分:2)

您可以定义它。 http://ideone.com/kJHGoF

#include <cstdio>

int main()
{
    void f(); // Forward declare function named "f" returning void in the
              // global namespace.
    f();
}

/*    
void g()
{
    f(); // ERROR!
}
*/

void f()
{
    std::puts("hello!");
}

我不确定为什么有人真的想要使用它。它以这种方式用于向后兼容C;但我不知道有人会用C做什么。

答案 1 :(得分:1)

它有时是声明和调用外部链接函数的快捷方式,该函数本身不会在标题中公开定义。例如,假设您正在链接一个C库,您知道该C库提供了LibDebugOn(int)调用但未在标头中定义它。它可以是在一个地方声明和调用它的快捷方式:

void myFunc() {
  // call "Lib" but turn on debugging via hidden API
  extern "C" void LibDebugOn(int); // declare hidden C-linked function
  LibDebugOn(1);  // call it
  // do something with the library here...
  LibDebugOn(0);  // turn off lib debugging now
}

公平地说,这对于一次性的快速黑客来说通常是值得的,而不是值得鼓励的。