Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 没有以前的原型?_C_Xcode_Function - Fatal编程技术网

C 没有以前的原型?

C 没有以前的原型?,c,xcode,function,C,Xcode,Function,可能重复: 我有一个在头文件中原型化的函数,但是Xcode仍然警告我,函数“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> #i

可能重复:

我有一个在头文件中原型化的函数,但是Xcode仍然警告我,
函数“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);
}
#包括
#包括“CelGL.h”
int-bind;
void setBind(int bindin){//此处是否没有警告?
bind=bindin;
}
void printBind(){//此处有警告
printf(“%i”,bind);
}
在C中,这是:

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

这是一个不带参数的函数原型

<> > C++中的规则不同,第一个声明了一个没有参数的函数,等于第二个.


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

虽然我现在理解了错误的原因,但我并不真正理解此功能的用途。何时定义一个不确定参数列表的函数,这与C++有什么关系?这是C++中有用的特性吗?不能用C++中的不确定参数列表来定义原型。在C++中,这意味着“没有参数”,而不是“不确定的参数”。与其说该功能有用,不如说它是对现实的必要让步。当C标准化时,整个庞大的代码库都是在没有原型的情况下编写的;它们在C中不存在。空括号符号是标准C之前的所有符号。如果将其定为非法,将扼杀新生的C标准。对于C99来说仍然是这样。C11不太清楚,但保持不变。
void printBind(void);