没有以前的原型?

时间:2012-03-02 23:56:05

标签: c xcode function

  

可能重复:
  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);
}

1 个答案:

答案 0 :(得分:20)

在C中,这个:

void printBind();

不是原型。它声明了一个不返回任何内容的函数(void),但它接受了一个不确定的参数列表。 (但是,该参数列表不是可变的;所有采用可变长度参数列表的函数必须在范围内具有完整原型以避免未定义的行为。)

void printBind(void);

这是不带参数的函数的原型。

C ++中的规则是不同的 - 第一个声明一个没有参数的函数,并且相当于第二个函数。

差异的原因是历史性的(读作'追溯到20世纪80年代中期')。当原型被引入C时(在它们被添加到C ++之后的几年),有一个巨大的代码遗产,它声明了没有参数列表的函数(因为在添加原型之前这不是一个选项),因此向后兼容性考虑意味着SomeType *SomeFunction();必须继续表示'一个返回SomeType *但我们对参数列表一无所知的函数'。 C ++最终添加了SomeType *SomeFunction(void);符号以便与C兼容,但不需要它,因为类型安全链接是早期添加的,并且所有函数在定义或使用之前都需要在范围内使用原型。