-
22-08-2019 - |
题
IM有点混乱。是什么向前声明和前瞻性的参考之间的区别?远期声明,在我的头上,当你宣布,心不是没有实现的功能,但是这是不正确的?你必须看指定的局面要么宣布的情况下,“向前参考”或“提前声明”?
解决方案
从维基百科:
转发宣言
中尚未定义的变量或函数的声明。其defnition以后可以看到。
转发参考
要向前声明但是其中出现的变量或函数类似的第一定义也到位。
其他提示
A 转发声明强>是一个方法或变量的声明您实施和使用它之前。前向声明的目的是节省编译时间。
变量的前向声明导致存储空间被搁置,所以可以以后设置该变量的值。
函数的提前声明也被称为“功能的原型,”是一个声明语句告诉编译器函数的返回类型是什么,该功能的名称是什么,以及它的类型参数。在语言如C / C ++和Pascal编译器店宣布符号(包括函数)的查找表,并且引用他们,因为它在你的代码遇到他们。这些编译器阅读你的代码顺序,即,从上到下,所以如果你不向前声明,编译器发现它不能在查找表中引用的象征,它提出了一个错误,它不知道如何响应的功能。
在向前声明是一个暗示到已定义(填写的执行)的功能在别处的编译器。
例如:
int first(int x); // forward declaration of first
...
int first(int x) {
if (x == 0) return 1;
else return 2;
}
但是,你问,我们为什么不只是让编译器进行两次传中每个源文件:第一个索引的所有符号里面,第二个解析引用,并看看他们?根据Dan故事:
当下在1972年创建的,计算资源被更加稀少 并以高溢价 - 所需的内存来存储复杂 程序的整个符号表一次根本不是可用 大多数系统。固定存储也是昂贵的,极其缓慢的,所以 想法像虚拟存储器或符号表中的存储部件 磁盘根本不会允许编译在一个合理的 时间表...当你处理磁带,其中寻道时间 在几秒钟内进行测量和读取吞吐量以每字节为单位 第二(未千字节或兆字节),这是非常有意义的。
C ++,而创建的几乎17年后,被定义为一个超集 的C,因此不得不使用相同的机制。
通过将Java在1995年推出身边的时候,平均电脑有足够的 内存拿着象征性的表,即使是一个复杂的工程,是 不再大幅负担。而Java并没有设计成 以C向后兼容,所以它没有必要采用旧式 机制。 C#为同样未支配。
其结果是,他们的设计者选择转移的负担 compartmentalizing象征性的声明背过程序员和 把它放在电脑上再次,自比例成本的 汇编的总工作量是最小的。
在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);
}
请注意“前方参照”有时使用,尽管不经常,作为同义词“前向声明。”
前向声明用于允许一个语言(C,帕斯卡)。的单通汇编
如果向前引用允许无(Java和C#),则需要两次通过编译器向前声明。