我有点困惑.前向声明和前向引用有什么区别?在我的脑海中,当你声明一个尚未实现的函数时,前向声明是不正确的?您是否必须查看指定的情况,以声明案例"前向引用"或"前向声明"?
一个向前声明是一个方法或变量的声明,您实施和使用它之前.前向声明的目的是节省编译时间.
变量的前向声明会导致存储空间被搁置,因此您可以稍后设置该变量的值.
函数的前向声明也称为"函数原型",它是一个声明语句,它告诉编译器函数的返回类型是什么,函数的名称是什么,以及它的参数类型.C/C++和Pascal等语言的编译器在查找表中声明符号(包括函数),并在代码中引用它们时引用它们.这些编译器按顺序读取您的代码,即从上到下,因此如果您不转发声明,编译器会发现它无法在查找表中引用的符号,并且会引发一个它不知道的错误如何回应这个功能.
前向声明是对编译器的暗示,您已在其他地方定义(填写了实现)函数.
例如:
int first(int x); // forward declaration of first ... int first(int x) { if (x == 0) return 1; else return 2; }
但是,你问,为什么我们不让编译器对每个源文件进行两次传递:第一个用于索引内部的所有符号,第二个用于解析引用并查找它们?丹故事说:
当C在1972年创建时,计算资源更加稀缺且高昂 - 在大多数系统中都无法立即存储复杂程序的整个符号表所需的内存.固定存储也很昂贵,而且非常慢,所以像虚拟内存或在磁盘上存储符号表部分这样的想法根本就不允许在合理的时间范围内进行编译......当你处理磁带时寻找时间是以秒为单位测量,读取吞吐量以每秒字节数(不是千字节或兆字节)来衡量,这非常有意义.
C++虽然在大约17年后创建,但被定义为C的超集,因此必须使用相同的机制.
当Java在1995年推出时,平均计算机有足够的内存,即使对于复杂的项目,持有符号表也不再是一个沉重的负担.Java并不是为了与C语言向后兼容而设计的,因此它不需要采用传统机制.C#同样没有受到阻碍.
结果,他们的设计师选择将符号声明的划分负担从程序员身上移开并再次放在计算机上,因为它的成本与编译的总工作量成比例是最小的.
在Java和C#中,标识符从源文件自动识别,并直接从动态库符号中读取.在这些语言中,出于同样的原因不需要头文件.
甲前方参照是相反的.它指的是在声明之前使用实体.例如:
int first(int x) { if (x == 0) return 1; return second(x-1); // forward reference to second } int second(int x) { if (x == 0) return 0; return first(x-1); }
请注意,"前向引用"有时会用作"前向声明"的同义词,但不常用.
来自维基百科:
前瞻宣言
声明尚未定义的变量或函数.他们的定义可以在后面看到.
前向参考
与前向声明类似,但变量或功能首先出现时,定义也已到位.