2013-01-31 53 views
8

一些例子,我碰到了一個程序,用菜單交易..爲什麼要在main中重新聲明一個函數?

他宣稱所有主要功能前,我的理解應該是函數,然後就是一個空函數裏面也提到的功能之一主:

char get_choice(void); 
char get_first(void); 
int get_int(void); 
void count(void); 
int main(void) 
{ 
    int choice; 
    void count(void); 
    while ((choice = get_choice()) != 'q') 
    { 
     switch (choice) 
     { 
      case 'a' : printf("Buy low, sell high.\n"); 
       break; 
      case 'b' : putchar('\a'); /* ANSI */ 
       break; 
      case 'c' : count(); 
       break; 
      default : printf("Program error!\n"); 
       break; 
     } 
    } 
    printf("Bye.\n"); 

...(功能實現)

能否請你告訴我這是爲什麼? TNX

+0

感謝您的編輯@djechlin – MNY

回答

4

這些只是函數的聲明而不是定義。不太清楚爲什麼count函數被聲明瞭兩次。聲明只是告訴編譯器有這個名字的地方。可能程序員忘了定義方法?

的聲明提供了一個符號的基本屬性:它的類型和它的名字。定義提供了該符號的所有細節 - 如果它是一個函數,它做了什麼;如果它是一個班級,它有什麼樣的領域和方法;如果它是一個變量,則存儲該變量。

例如,聲明如下所示:

void count(void); 

如定義是這樣的:

void count(void){ 

...... 

} 
6

沒有任何理由,這是原型的只是一個毫無意義的重複。

+0

謝謝allot @unwind – MNY

3

並不重要 - 無論你的程序是有意義的。顯然,如果它在main中,那麼在實際函數實現之前沒有其他函數會「知道」函數原型是什麼,這可能會產生影響。

我個人傾向於實現該功能被調用之前,這樣避免放在哪裏原型[除非它會在headerfile,在這種情況下,往往解決問題]這個問題。

+0

感謝一堆@ MatsPetersson – MNY

1

能否請你告訴我這是爲什麼? tnx

沒有爲什麼超出它是一個簡單的錯誤;作者只是錯過了多餘的聲明。只要這兩個聲明是相同的,這不是一個問題(雖然它很醜,應該清理乾淨)。

FWIW,這就是爲什麼我總是定義功能之前,它們在同一個文件中使用。這個定義算作一個聲明,所以只有一個原型需要擔心。

相關問題