2011-05-23 139 views
1

任何人都可以告訴我,我們可以在用戶定義的函數中聲明一個函數嗎?如C中的嵌套函數?

int sum(int x, int y) 
{ 
    int fun(float x); 
} 

我們可以在函數內部定義一個函數嗎?據我所知,我們不能在函數內部定義函數。

但我只是做了這一點,它的做工精細的代碼如下:

{ 
    int main() 
    { 
     func1(); 
     return 0; 
    } 
    func1() 
    { 
     int i = 0; 
     auto func2() 
     { 
      i = 10; 
      printf("Heloo i am func 2\n"); 
     } 
     printf("Heloo i am func 1\n"); 
     func2(); 
    } 
} 

它工作得很好。

現在誰能告訴我一個函數中的函數是如何定義或正常工作的?

任何人都可以向我解釋爲什麼代碼工作?

現在,當我改變的代碼,它給我下面的問題 幾行的變化如下:

代碼:

{ 
    func1() 
    { 
     func2(); 
     int i = 0; 
     auto func2() 
     { 
      i = 10; 
      printf("Heloo i am func 2\n"); 
     } 
     printf("Heloo i am func 1\n"); 
    } 

錯誤:

error: static declaration of ‘func2’ follows non-static declaration 
note: previous implicit declaration of ‘func2’ was here 

現在這些是什麼錯誤他們爲什麼要來?

如果我打電話func2()main功能比它會顯示類似 undefined reference to func2

錯誤現在誰能告訴我這裏有什麼問題?

+2

方式太多問號...... – 2011-05-23 10:19:16

+0

應該指出的是,這是否允許只是一種語言書呆子的好奇心。在現實世界的應用程序中,您絕不會在其他函數中寫入聲明或定義。 – Lundin 2011-05-23 11:23:54

回答

2

C標準允許的函數的函數中的聲明(如在第一個代碼段),而不是功能的定義功能內(儘管一些編譯器可以提供它作爲一個非標準擴展)。

對於C++也是如此,雖然新版本(C++ 0x等)允許您定義匿名lambda函數。但這是不同的。

+0

有什麼不同我想知道,爲什麼代碼正在執行? – user513164 2011-05-23 10:29:01

+0

@user:據推測你正在編譯器支持嵌套函數。大概它需要在被調用之前聲明該函數*(對於「標準」非嵌套函數,這當然是正確的)。在你的代碼片段中並不適用。 – 2011-05-23 10:30:39

1

gcc allows this in C only (not C++)通過-fnested-functions,但這當然是非標準的和不可移植的,所以你應該不應該使用嵌套函數,除非你有一個很好的理由。

+0

pal當我在定義之前調用func2時出現錯誤 – user513164 2011-05-23 10:25:56

0

這爲foo

int main(void) { 
    int foo(void); 
} 

不是foo定義。這是一個聲明,它是完全有效的(雖然奇怪:函數聲明不屬於任何其他函數)C

什麼C不允許,這是你發現,是定義不能嵌套。

/* INAVLID EXAMPLE */ 
int main(void) { 
    int foo(void) { return 0; } 
} 
0

當你聲明之前致電func2(),C假設(根據標準)的隱式聲明int func2(...),但是當編譯器發現func2()定義,從之前的隱式聲明不同,所以編譯器會抱怨它。 如果func2()在呼叫func2()之前,它既充當定義又聲明,因此在那裏沒有問題。

當然func2(),並且不能從main()稱爲其範圍僅限於func1(),就像你不能從另一個函數訪問局部變量。

正如其他人提到的,嵌套函數在C中不是標準的,儘管一些編譯器(如GCC)支持這個特性。

0

這只是對Paul R的回答的補充。 假設你的編譯器是gcc, 的 document保羅的回答結束說:

A nested function always has no linkage. Declaring one with extern or static is erroneous. If you need to declare the nested function before its definition, use auto

所以func2都將被聲明爲auto它的調用之前。
如果第二個代碼

func1() 
{ 
    func2(); 
    int i = 0; 
    ... 

改變

func1() 
{ 
    auto func2(); /* declaration added */ 
    func2(); 
    int i = 0; 
    ... 

的代碼進行編譯。