2014-11-04 20 views
6

我碰到這片FreeRTOS操作系統源傳來:在其他函數中聲明函數方法的用例是什麼?

void vApplicationIdleHook(void) 
{ 

    /* The simple blinky demo does not use the idle hook - the full demo does. */ 
    #if(mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0) 
    { 
     extern void vFullDemoIdleHook(void); 

     //* Implemented in main_full.c. */ 
     vFullDemoIdleHook(); 
    } 
    #endif 

} 

爲什麼人會聲明函數/這樣的方法?有什麼優勢?我在Java中也見過類似的代碼。

+3

函數聲明與Java如何執行操作無關。 – user694733 2014-11-04 11:01:39

+0

這是可能的,但不常見。由於這種可能性,我們有最令人煩惱的解析。 – 2014-11-04 11:03:15

+0

@ user694733 Java可以在方法中定義方法,不是嗎? – 2014-11-04 11:05:19

回答

8

我假定這是在使用vFullDemoIdleHook工作的唯一地方,所以很明顯&簡潔只保留聲明和函數調用所有的這幾行代碼。

在其他地方放置聲明有什麼好處?考慮替代...這也許正是你更習慣於看到:

/* The simple blinky demo does not use the idle hook - the full demo does. */ 
#if(mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0) 
extern void vFullDemoIdleHook(void); 
#endif 


void vApplicationIdleHook(void) 
{ 

    /* The simple blinky demo does not use the idle hook - the full demo does. */ 
    #if(mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0) 
    { 
    //* Implemented in main_full.c. */ 
    vFullDemoIdleHook(); 
    } 
    #endif 

} 

我看不出有什麼優勢,這

+0

一個優勢可能是它更「正常」,因此會造成更少的混淆和浪費時間。 – 2014-11-04 11:39:31

+1

我不認爲這個論點適用於此;沒有人會對這是幹什麼感到困惑。最糟糕的情況是,它只會讓人放鬆警惕。 – tenfour 2014-11-04 11:51:24

1

我會說,沒有任何理由來聲明函數的函數內它給了錯誤的印象,它不知何故僅限於該功能,而不是。 默認情況下函數具有外部鏈接(除了您的代碼專門具有extern),並且聲明函數內部應該被認爲是不正確的做法(但有效)。

原型應該位於頭文件中(如果沒有頭文件,則位於源文件的頂部)。我想聲明移到main_full.h

extern void vFullDemoIdleHook(void); /* extern keyword is redundant here */ 

main_full.c:

void vApplicationIdleHook(void) 
{ 
    /* The simple blinky demo does not use the idle hook - the full demo does. */ 
    #if(mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 0) 
    { 
     //* Implemented in main_full.c. */ 
     vFullDemoIdleHook(); 
    } 
    #endif 
} 

除非您打算使用相同的函數名vFullDemoIdleHook用於不同的目的(這將是可怕的),你不不需要有條件地(#if)聲明函數原型。

+0

「,因爲它給_false印象_它在某種程度上僅限於該功能,而不是」。你能解釋一下你的意思嗎?從C99開始,每個函數都必須在其調用之前聲明。 – 2014-11-04 13:24:22

+0

即在另一個函數內聲明一個函數的原型。 – 2014-11-04 13:47:07

+0

如果我錯了,糾正我,但是這樣的原型因其範圍而變窄(例如塊),並且這樣的函數在別處是「不可調用的」(除非在包含的頭文件中或者在所考慮的翻譯單元內的任何函數外有更多的聲明)。這意味着這樣的函數實際上受限於(從程序員的角度來看)這樣的塊(正如我前面所指出的,C99/C11語義的思考)。 – 2014-11-04 14:30:17

相關問題