2011-11-11 30 views
6

看到這個代碼另一個函數定義中的函數定義:它有效嗎?

#include<stdio.h> 

int main() 
{ 
    void test(void) 
    { 
     printf("test"); 
     return; 
    } 
printf("main"); 
return 0; 
} 

這種男女同校的正常工作和犯規給出任何警告和錯誤。我不明白爲什麼會發生這種情況? 這裏我寫了一個函數定義裏面的其他函數定義,所以它是有效的?

編輯:如果是的話那麼有沒有這個用法?

爲什麼gcc需要添加此功能作爲擴展..應該有任何用法,這不是嗎?!

+1

看起來像一個重複:HTTP://stackoverflow.com/questions/666586/are-nested-functions-part-of-c-standard 你可能會有興趣看到:http://stackoverflow.com/questions/1348095/why-are-nested-functions-not-supported-by-the-c-standard&http://www.informit.com/articles/article。 ASPX?p = 1676713 –

+0

@ another.anon.coward感謝那些鏈接... –

回答

6

函數定義的嵌套依賴於GCC擴展的工作。它沒有被標準描述。

如果您希望自己的代碼與其他編譯器一起工作,那麼您應該避免使用這些技術。更重要的是,如果你與其他開發者合作,我預測他們中的很多人會不喜歡使用這種非標準的結構。

我不是GCC的專家,但我相當確定有編譯器選項來禁用擴展。這將允許你讓編譯器確保你沒有編寫不能與其他編譯器一起編譯的代碼。


關於你的更新有嵌套函數的用法。它們可以通過限制範圍和可視性來幫助封裝。然而,沒有嵌套函數不能完美解決的問題,我想解釋爲什麼它們是一個很少使用的GCC特性。

+0

你真正的天才......你給了這麼多回答我的問題.. !! –

+0

爲什麼在函數中定義函數不在標準(C89和C99)中? – Sahil

+3

@Sahil因爲C不是那樣設計的。 –

1

我知道GCC有這個作爲擴展。據我所知,這不是標準的一部分。

3

定義一個嵌套函數(即在另一個函數內)是有效的,唯一的限制是前一個函數的作用域被封閉函數限制。這就像定義一個局部變量一樣。你可以在這裏找到更多的信息:http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

2

Joachim關於嵌套函數是GCC擴展的答案是正確的;您還問過它是否有任何用法:我已經看過數百個項目的源代碼,並且從未見過使用此特定GCC擴展的任何人。

2

是的,我們可以在其他函數中定義一個函數。我在gcc中編寫了下面的書面代碼,並且它在沒有顯示錯誤的情況下成功運行。

#include<stdio.h>; 
void main() 
{ 
    int sum() 
    { 
     int a=30, b=10, c=20, sum=0; 
     sum=a+b+c; 
     return sum; 
    } 
    int a; 
    a=sum(); 
    printf("Sum = %d", a); 
} 

O/P:60

相關問題