1

ブロックスコープで関数を宣言できるようです:

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

しかし、私はそれを定義することはできません:

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

私の質問は、ブロック スコープでの関数宣言の用途は何ですか? ユースケースとは?

4

2 に答える 2

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でこれをどうするかわかりません.

于 2013-05-23T01:39:40.273 に答える
2

それ自体がヘッダーでパブリックに定義されていない、外部にリンクされた関数を宣言して呼び出すためのショートカットになる場合があります。たとえば、LibDebugOn(int)呼び出しを提供していることがわかっているがヘッダーで定義していない C ライブラリに対してリンクしているとします。1 か所で宣言して呼び出すためのショートカットになります。

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
}

公平を期すために、これは通常、1 回限りの簡単なハックにのみ価値があり、推奨されるものではありません。

于 2013-05-23T01:55:26.377 に答える