2012-03-02 47 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