2013-04-24 57 views
7

我似乎無法得到這個遞歸函數編譯正確,我不知道爲什麼。 代碼如下:注:以前的隱式聲明'point_forward'在這裏

void point_forward (mem_ptr m) { 
    mem_ptr temp; 
    temp = m->next; 
    if (temp->next != NULL) point_forward(temp); 
    m->next = temp->next; 
} 

我的編譯器將返回此:

mm.c:134:6:警告:衝突的類型 'point_forward'[默認啓用]
毫米。 C:96:2:注:以前隱含的 'point_forward' 宣言在這裏

+2

請粘貼你在線96 – 2013-04-24 01:57:06

+0

point_forward(m); – user2313514 2013-04-24 01:58:30

+0

這是我的代碼中這個函數的唯一另一個實例。 – user2313514 2013-04-24 01:59:20

回答

12

的關鍵是這樣的:

以前隱式聲明的「point_forward」在這裏

在線96你有:

point_forward(m); // where m is a mem_ptr; 

由於編譯器目前還沒有看到一個函數聲明爲point_forward(m),它「含蓄定義「(即,假設)返回int的函數:

int point_forward(mem_ptr m); 

This與定義後衝突:

void point_forward (mem_ptr m) { 

爲了解決這個問題,你可以:

  1. 把一個明確的報關行96在什麼地方:void point_forward(mem_ptr m);這將告訴編譯器如何看待point_forward()當它在第96行看到它時,即使它還沒有看到函數的實現。或者,定義96行以上的全部功能(將行134的功能定義向上移至96行以上)。

這裏有一點more about declaring functions

一般來說,對於風格,我要麼:

  • 如果你不希望在任何其他C文件使用point_forward(),完全定義它:在

    static void point_forward(mem_ptr m) { ..function body goes here.. }

    源文件的頂部。

  • 如果你想在其他C文件中使用point_forward(),把一個向前聲明:

    void point_forward(mem_ptr m); 
    

    在頭文件中的其他文件包括。