为什么在 C# 中编写声明和使用函数的顺序与 C++ 相反并不重要

ski*_*347 0 c# c++

我想知道,当我在 C# Unity 中为我的游戏编写代码时,我可以在使用它们后在代码中声明 void ,并且代码仍然有效。另一方面,当我编写纯 C++ 代码时,我需要在使用函数之前声明它们,我很好奇为什么会出现这种差异?

Dai*_*Dai 5

我想知道,当我在 C# Unity 中为我的游戏编写代码时,我可以在使用它们后在代码中声明 void,并且代码仍然有效。另一方面,当我编写纯 C++ 代码时,我需要在使用函数之前声明它们,我很好奇为什么会出现这种差异?

简短回答

  • 因为 C++ 和 C# 是完全不同的编程语言,具有完全独立的背景和编译器。
  • 因为C++是建立在C之上并继承了它的编译过程。
  • ...C 是在编译器仅以最少的 RAM 使用量对源代码进行 1 次传递时设计的,这需要前向声明,而 C# 是在编译器可以进行“多次传递”运行并构建大型内存时设计的程序模型消除了预先声明的需要。

更长的答案

请注意,“多次传递”并不是指编译器实际上多次从头开始重新解析和处理源文件;这意味着,在 C# 编译器解析源代码(仅发生一次)之后,它可以提取程序实际使用的事物(如类型、方法等)的所有符号,并将其存储在内存中的一个列表 ( list-of-used-things),并且在构建了由程序完全定义的所有内容的列表 ( list-of-defined-things) 并比较两个列表后,才会抱怨引用丢失/损坏。而在 20 世纪 70 年代和 80 年代初,计算机根本没有足够的内存来存储这些事物列表,因此 C 语言需要它。

现在,在 2021 年的今天,可以说有可能有一个不需要前向声明的 C(甚至是 C++ 编译器),但是这是另一个主题,涉及太多我不会讨论的原因(尽管主要原因是可能是因为根本没有任何需求:所有现有的 C 和 C++ 程序都已经具有前向声明,没有人会仅仅因为单个编译器支持它而编写没有前向声明的 C 或 C++ 程序。语言设计委员会可以引入它,但由于前向声明是 C 语言设计的基础,这对更广泛的 C 和 C++ 生态系统来说将是一个真正巨大的突破性变化,每个人都会抱怨。

C++ 是建立在 C 之上的,因此它继承了 C 的前向声明要求。与当时其他 OOP 语言(如 Smalltalk 和 Object Pascal)相比,C++ 与 C 源代码的兼容性对于 C++ 的流行是一个巨大的积极因素,这需要将现有的 C 程序完全移植到新语言或需要 C程序以二进制形式链接,这使一切变得复杂。

Objective-C 是另一种构建在 C 之上的 OOP 语言,它也继承了 C 的前向声明要求

可以说,C++本来可以被设计为能够在没有前向声明的情况下进行编译,但这会增加其与 C 源文件的兼容性的大量复杂性,并且几乎肯定会延迟 C++ 本身的发布日期,因为制定了规范没有前向声明的 C 兼容编译究竟如何工作需要数月甚至数年才能完成。

快进到 20 世纪 90 年代中期,出现了 Java(最终是 C#),这些现代编程语言根本不打算与 C 程序源代码兼容(尽管有共享的大括号语法),这意味着这些语言不需要围绕同时代硬件限制所施加的限制进行设计。

这并不是说 Java 语言的人体工程学设计没有受到其编译器设计的影响:Java仍然需要每个文件 1 个类型CLASSPATH/SOURCEPATH胡说八道。我知道这些限制对于 Java 当时非常快速和简单的编译器来说是必要的,这确实意味着所有 Java 项目都将具有可预测的布局,但 25 多年后,这些限制越来越多地被视为给程序员带来了非常繁琐的负担,并且总体而言愚蠢的限制几乎没有什么好处。然而,与 C#、Rust、Kotlin、Go、Swift 等后 Java 语言相比,它们将项目的源代码安排与编译输出完全解耦。


我假设您已经读过这篇文章:什么是 C++ 中的前向声明?- 如果您还没有读过,那么您应该先阅读它。

现在,考虑此表并找出相关性:

语言 C C++ 爪哇 C#
优质的 1972年 1985 年左右 1995年 2001年
示范性同期典型工作站 等离子11 惠普200系列 SPARC 站 10 米色盒子
RAM 成本:每 MiB 美元 不适用 1,000 美元 32 美元 4 美元
所述同时代典型工作站中的典型RAM 56 KB 512 KB 32 兆字节 128 兆字节
单遍编译器 是的 是的
需要前置声明 是的 是的
语言人体工程学 基本的 可怕 好的 非常好

总之:编译器可以使用的 RAM 越多,意味着语言就越符合人体工程学,因为编程语言的基本设计不需要因为内存不足而对解析器/编译器/链接器施加限制而受到影响。

  • “语言人体工程学”啊啊..这很伤人…… (2认同)