2

据我所知,在 C++ 应用程序中,如果包含头文件 - 头文件的内容将粘贴到代码中。

另一方面,在 Java 中——当你导入一个 java 库时——参数被传递给 JVM 中的库(我希望我是对的)。

我想知道的是 Pascal 程序中 uses 子句的行为是什么。

4

1 回答 1

4

这三个都与如何从多个源文件构建程序有关。

C/C++ 具有最低级别,编译器需要包含所有必需的声明,并为每个源代码(.c、.cpp)重新编译,就好像它是一个大源代码一样。

Pascal 也支持这一点(它有一个 $INCLUDE 指令),但它的使用要少得多(在系统编程中甚至更多,在应用程序编程中几乎没有使用)。使用它继承了 C/C++ 的所有问题,但由于使用量少,因此不太明显。

这是因为有了 Uses/units 系统,Pascal 有一个更好的系统,可以安全、自动地导入其他部分,而无需重新编译它们。也可以内联函数而不在标头中声明它们。

Java 原则上几乎相同,但它的实现完全不同(基于分层嵌套命名空间,而不是像 Pascal 那样总是采用 unitname.identifiername[.fieldnames] 形式的命名空间)

尽管编译器可以通过只传递主文件和一堆路径来编译程序,但 Java 和 Pascal 都得到了好处。编译器会自己研究编译什么,不编译什么。它还使他们能够从找到的源代码中自动构建链接器行。

这使得需要复杂的外部构建系统(如 make)和手动维护它的管理(makefile)以进行基本的构建模拟。

所以总而言之,它们都是一样的(多个源文件之间的交互),但是 Pascal 和 Java 系统建立在它之上以便于使用,并在编译器上给予更多的控制

稍后添加:模块化系统的核心原则是将一个头文件硬链接到每个主代码文件(仅按照 C 中的约定链接),并对预处理器进行更改,仅针对该文件(以及 $INCLUDE'd,但不是使用/导入的文件。因此,模块开始时的预处理器状态仅取决于编译器启动状态。(阅读:内部编译器和命令行/环境)。请注意,这意味着无法导入宏通过USES,因为它们是预处理器状态。

于 2011-07-28T11:05:50.820 回答