2010-03-18 104 views
2

我只是實現了一個功能可能另一個函數內部在C定義:嵌套函數最佳實踐

void main(){ 
    int foo(){ return 2; }; 
    printf("%d\n", foo()); 
} 

除了是一個巧妙的方法,這個有用的事是,內部函數是私有的外部功能。但是......在「現實世界」應用程序中這樣做是否有足夠的理由?什麼是使用這種語法的最佳實踐?

+3

'main'返回'int',而不是'void'。 – 2010-03-18 03:07:53

+1

某人在功能中使用*非常*非標準函數不太可能讓人擔心主要回報:-) – paxdiablo 2010-03-18 03:50:45

+0

我們可以嵌套多少個關卡? – Lazer 2010-03-18 04:13:56

回答

14

嵌套函數是一個非標準擴展,implemented by GCC(也許別人認爲我不知道關於)。鑑於它不符合標準,最佳實踐可能包括而不是將它用於您打算進行移植的代碼中。

如果您的最終目標是在C中具有「私有」功能,那麼您最好使用單獨的文件並將「私有」功能設置爲靜態,以便它們不會鏈接到其他目標文件。

+2

還要注意,即使gcc僅支持C,而不是C++。 – 2010-03-19 02:55:00

1

如果您正在編寫一個將Pascal(允許嵌套過程)轉換爲C並且依賴GCC將結果轉換爲二進制文件的編譯器,那麼此功能當然很有用。

0

如果我沒有記錯的話,嵌入式函數可以看到它們的父函數符號。在某些情況下,這可能對避免全局變量有幫助(幫助線程安全?)。由於這個特性是GCC特有的,除非我真的需要它,否則我會盡量避免它。

+0

通過「知名度」你是指訪問?在那種情況下,這將是非常具體的,不像其他語義。 – Potatoswatter 2010-03-19 03:02:38

+0

是的,就我所知,嵌入函數具有與函數內其他任何塊相同的範圍。從以前的評論中的GCC鏈接中,「嵌套函數可以訪問包含函數的所有變量,這些變量在其定義時是可見的,這就是所謂的詞法作用域。例如,在這裏我們展示了一個嵌套函數,它使用繼承變量...「 – joe 2010-03-23 01:54:15