2012-03-02 48 views
5

可能重複:
Error: No previous prototype for function. Why am I getting this error?沒有以前的原型?

我有我的頭文件中原型的功能,但是Xcode中仍然給我警告No previous prototype for the function 'printBind'。我以相同的方式創建了功能setBind原型,但是在我的實現中我沒有看到這個函數的警告。

CelGL.h

#ifndef Under_Siege_CelGL_h 
#define Under_Siege_CelGL_h 

void setBind(int input); 
void printBind(); 

#endif 

CelGL.c

#include <stdio.h> 
#include "CelGL.h" 

int bind; 

void setBind(int bindin) { // No warning here? 
    bind = bindin; 
} 

void printBind() { // Warning here 
    printf("%i", bind); 
} 

回答

19

在C中,這樣:

void printBind(); 

不是原型。它聲明瞭一個函數,它不返回任何內容(void),但接受一個不確定的參數列表。 (不過,參數,參數列表不變量;以可變長度的參數列表中的所有功能必須有一個完整的原型的範圍,以避免不確定的行爲。)

void printBind(void); 

這是不帶任何功能的原型參數。

C++中的規則是不同的 - 第一個聲明一個沒有參數的函數,相當於第二個。

區別的原因是歷史(可以追溯到20世紀80年代中期)。當原型被引入到C中時(它們被添加到C++後的幾年),有大量代碼聲明瞭函數沒有參數列表(因爲在添加原型之前這不是一種選擇),所以向後兼容性考慮意味着那SomeType *SomeFunction();不得不繼續含義'返回SomeType *的函數,但我們對參數列表一無所知。爲了與C兼容,C++最終添加了SomeType *SomeFunction(void);表示法,但並不需要它,因爲類型安全鏈接被提前添加,所有函數在定義或使用前都需要原型。

+0

雖然我現在明白錯誤的原因,但我並不真正瞭解此功能的用處。你什麼時候可以定義一個帶有不確定參數列表的函數?這與C++有什麼關係?這是C++中的一個有用的功能嗎? – sherrellbc 2017-12-04 13:52:58

+0

您無法在C++中定義具有不確定參數列表的原型。在C++中,這意味着「沒有參數」,而不是「不確定參數」。這個功能並沒有像現實中的必要讓步那麼有用。當C被標準化時,整個龐大的代碼庫被編寫成沒有原型;它們在C中不存在。空括號符號全部都在標準前C中。如果違法,它會殺死新生的C標準。 C99仍然如此。 C11不太清楚,但保持不變。 – 2017-12-04 14:55:01