【发布时间】:2011-06-13 01:31:43
【问题描述】:
在阅读this question 的一些答案时,我开始想知道为什么编译器实际上确实在第一次遇到函数时需要知道它。在解析收集其中声明的所有符号的编译单元时添加一个额外的传递不是很简单,这样声明和使用它们的顺序就不再重要了吗?
有人可能会争辩说,在使用函数之前声明它们肯定是一种很好的风格,但我想知道,在 C++ 中这是强制性的还有其他原因吗?
编辑 - 举例说明: 假设您必须在头文件中内联定义函数。这两个函数相互调用(可能是递归树遍历,其中树的奇数层和偶数层的处理方式不同)。解决此问题的唯一方法是在另一个函数之前对其中一个函数进行前向声明。
一个更常见的例子(虽然是类,而不是函数)是具有private 构造函数和工厂的类的情况。工厂需要知道类才能创建它的实例,而类需要知道friend 声明的工厂。
如果这是过去的要求,为什么没有在某个时候删除?它不会破坏现有代码,对吗?
【问题讨论】:
-
其实即使在实际的C++中,你也可以找到一个函数在声明之前可以使用的地方(严格来说,“之前”是关于程序源代码被读取的顺序)——一个班里面! (这可能是因为编译器在类声明后面放置了一个函数定义,正如这里有人指出的那样。) class A { public: static void foo(void) { bar(); } 私人: 静态无效栏(无效) { 返回; } }; int main() { A::foo();返回0; }