【发布时间】:2014-04-21 22:28:12
【问题描述】:
这纯粹是为了满足我自己的好奇心,但为什么函数和类型只针对代码中定义的那些较早进行解析,而不是在同一范围内anywhere?
有时会在函数需要相互调用时出现:
void foo(int depth) { bar(depth + 2); }
void bar(int depth) { if (depth > 0) foo(depth - 3); }
您需要将 bar 移到 foo 之前的位置,或者事先声明 bar:
void bar(int);
void foo(int depth) { bar(depth + 2); }
void bar(int depth) { if (depth > 0) foo(depth - 3); }
在更复杂的示例中,您可能需要查看 #include 树和 #ifndef 保护,以找出您的代码无法识别在其他文件中定义的函数或类型的原因,前提是您已经知道应该这样做检查一下。
当然还有这个经典:
typedef struct {
Node *next;
} Node;
你需要知道这是可能的:
typedef struct Node {
struct Node *next;
} Node;
...但显然很多人不这样做,所以他们只是到处使用 'void *' 或 'struct Node'。
那么,这些编译器也不能向前解析是有原因的吗?我可以理解预处理器只向后检查,因为事情可以是#undefined,但是一旦声明了一个类型或函数,它就永远存在并且不能被以后的定义重载。
是因为历史原因,最初开发时可用的技术有限吗?还是我遗漏了一些逻辑上的歧义?
【问题讨论】:
-
我认为更多的是它还没有达到那些功能,而不是它向后阅读。
-
这里有很多 C-isms 永远不会出现在 C++ 代码中。
-
不是编译器,而是语言的定义方式。
-
@OliCharlesworth:可以根据编译器工作量来定义语言。强制定义在其使用之前减少编译器所需的传递次数。
-
在过去 64KB 的内存要花很多钱而且读取穿孔卡片组两次是不切实际的时代,设计语言以便单次编译器可以编译它们是一个强大的目标。 C++ 实际上并非如此,它允许定义使用尚未声明的成员函数的内联函数。 “1.5”通编译器:)