簡體   English   中英

C中的函數內部函數

[英]Function inside function in C

有人請詳細說明這些錯誤: -

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");
}

我得到的錯誤是:

  • 在功能'main'中:
  • 第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");
}

您正在使用GNU C編譯器的擴展,它允許嵌套函數的聲明。 該錯誤來自於以下事實:GCC擴展下的嵌套函數的前向聲明需要添加auto關鍵字。

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

ANSI C不允許嵌套函數定義。 你的main函數應該返回int

標准C / C ++中不允許嵌套函數 如果你想稍后定義它,只需(向前)聲明main()func()

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;
}

您正在采取的是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聲明:-)

嵌套函數是特定於gcc的擴展 ; 它們並非得到普遍支持。

關於main的警告, main的標准簽名是

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

實現可以提供額外的簽名(一些編譯器允許環境變量的第三個參數),但這些附加簽名必須由實現記錄; IOW, void main()只適用於有效的簽名main ,如果你的編譯器的文檔明確地列出了它本身。

如有疑問,請使用上述標准簽名之一。

  1. 你沒有在調用之前定義func
  2. 與原始線路相關聯。
  3. 你沒有返回int。

如果刪除int變量聲明中的func()聲明,它就有效。

C ++不允許將函數包含在其他函數中。

試圖在VS 2010中這樣做:

'funct':本地函數定義是非法的

您需要移動該函數並將其聲明移出main。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM