7

誰でもこれらのエラーを詳しく説明してください:-

void main()
{
    int a=5, b=60, func();

    printf("\nI am in main-1");

    int func(){
        printf("\nI am in funct");
        return 1;
    }
    func();
    printf("\nI am in main-2");
}

私が得るエラーは次のとおりです。

  • 関数「メイン」では:
  • 行 8: エラー: 'func' の静的宣言が非静的宣言に続いています
  • 4 行目: エラー: 'func' の前の宣言がここにありました
  • 3 行目: 警告: 'main' の戻り値の型が 'int' ではありません

次のコードが正常に機能しているため、C ではネストされたクラスが許可されていると思います。

void outerfunc()
{
    int func()
    {
        printf("\nI am in funct");
        return 1;
    }

    func();
}

void main()
{
    printf("\nI am in main-1");

    outerfunc();
    printf("\nI am in main-2");
}
4

8 に答える 8

14

ネストされた関数の宣言を許可する GNU C コンパイラの拡張機能を使用しています。autoこのエラーは、GCC の拡張機能でネストされた関数の前方宣言には、キーワードを先頭に追加する必要があるという事実から発生します。

int a=20,b=11;
int main()
{
  int a=5, b=60; 
  auto int func(); // <--------- here
  func(); // <- call it
  printf("\nI am in main-1");

  int func(){
  printf("\nI am in funct");
  return 1;
  }

printf("\nI am in main-2");
 return 0;
}

詳細については、http: //gcc.gnu.org/onlinedocs/gcc/Nested-Functions.htmlを参照してください。

于 2011-09-06T11:49:14.353 に答える
9

ANSI C では、ネストされた関数定義は許可されていません。また、メイン関数はintを返す必要があります。

于 2011-09-06T11:43:38.217 に答える
1

ネストされた関数は gcc 固有の拡張機能です。それらは広くサポートされているわけではありません。

に関する警告に関する限り、mainmain の標準シグネチャは次のとおりです。

int main(void)
int main(int argc, char **argv) // or equivalent

実装追加の署名を提供する場合があります (一部のコンパイラは環境変数の 3 番目のパラメーターを許可します) が、それらの追加の署名は実装によって文書化する必要があります。IOWは、コンパイラのドキュメントに明示的に記載されている場合に void main()のみ有効な署名です。main

疑わしい場合は、上記の標準署名のいずれかを使用してください。

于 2011-09-06T14:23:58.823 に答える
1

標準 C/C++ では、ネストされた関数は許可されていません。後で定義する場合は、単純にfunc()内部を(前方に) 宣言します。main()

int main()
{
  int a=5, b=60, func();

printf("\nI am in main-1");

  int func();  // <---- declare inside main()

printf("\nI am in main-2");
}


int func(){    // <---- define later
  printf("\nI am in funct");
  return 1;
}
于 2011-09-06T11:44:52.470 に答える
1

あなたが取っているのはGCC固有の機能であり、「適切な」C機能(つまり、ANSI C仕様の一部)ではありませんでした。

この機能を使用したい場合は、次のことを求めていると思います。

#include <stdio.h>

int a = 20, b = 11;

int main( int argc, char* argv[] )
{
    int a = 5, b = 60;
    auto int func( void );

    printf("\nI am in main-1");

    int func( void )
    {
        printf("\nI am in funct");
        return 1;
    }

    printf("\nI am in main-2");
    return func();
}

以前のコードが機能しなかった理由は、ネストされた関数にリンケージがないためです。

ネストされた関数には常にリンケージがありません。extern または static で宣言するのは誤りです。ネストされた関数をその定義の前に宣言する必要がある場合は、auto を使用します (それ以外の場合は関数宣言には意味がありません)。

上記のサンプルでは、​​したがってautoキーワードを使用しています。私はまた、あなたのmain宣言を修正する自由を取りました:-)

于 2011-09-06T11:48:43.790 に答える
0

C++ では、関数を他の関数内に含めることはできません。

VS 2010 でそうしようとすると、次のようになります。

'funct' : ローカル関数の定義が不正です

その関数とその宣言を main の外に移動する必要があります。

于 2011-09-06T11:48:54.400 に答える
0
  1. func呼び出す前に定義していません。
  2. 元の行に戻ります。
  3. あなたはintを返していません。
于 2011-09-06T11:44:24.373 に答える
0

変数宣言func()での宣言を削除すると機能します。int

于 2011-09-06T11:45:58.477 に答える