11

以下のコードを参照してください。別の関数で関数を定義しています。

void test1(void)
{
 void test2(void)
 {
   printf("test2\n");
 }
 printf("test1\n");
}

int main(void)
{
 test1();
 return 0;
}

この使用法は奇妙です.c89/c99の使用法ですか、それともgccの拡張のみですか(私はコンパイルされたubuntu 12でgcc 4.6.3を使用しました)。このコードを実行すると、「test2」と「test1」が出力されます。test2 は test1 でのみ呼び出すことができます。

さらに、この用法の一般的なシーンは何ですか、またはこの用法は何に使用されますか?

4

4 に答える 4

18

はい、これはGCC 拡張機能です。

C ではなく、移植性がないため、GCC が

  • コードのビルドに使用される唯一のコンパイラになる
  • 将来のバージョンでこの機能をサポートし続ける
  • 最小の驚きの原則を気にしないでください。
于 2013-05-16T08:40:22.217 に答える
2

http://gcc.gnu.org/onlinedocs/gcc-3.0.2/gcc_5.html#SEC71

ネストされた関数の説明。

于 2013-05-16T08:40:21.403 に答える
0

ネストされた関数は C でのみ許可されていますが、その関数スコープ内でのみ表示されるため、めったに使用されません。ただし、ネストされた関数を回避したい場合は、次のようなことができます

#include<stdio.h>
typedef void (*fptr)(void);
fptr test1(void) {
    void test2(void) {
        printf("test2\n");
    }
printf("test1\n");
return test2;
}
int main(void) {
    void (*f)(void);
    f = test1();
    f();
    return 0;
 }
于 2013-05-16T09:17:05.047 に答える