Fortran 和 c 在源代码如何接口和编译在一起方面的细微差别

Subtle difference between Fortran and c with respect to how sources are interfaced and compiled together

两种语言都有一种方法可以让单个 program/library 跨越多个文件。 C 语言使用 include 语句使用显式创建的头文件,而 Fortran 让编译器从单个 module 生成接口。如果我误解了这两种语言如何编译其源代码,请提前原谅我。

在 c/c++ 程序中,您通常创建包含源代码的 .c 文件和包含代码接口的 .h 文件,以便其他源文件可以预测源代码中的内容,然后一起编译成库、目标文件等。

在 Fortran 程序 (90+) 中,您可以将代码放入单独的 mod 规则中,而不是显式地为每个规则编写一个 header/interface 文件,编译器将为它们生成接口并除了已编译的目标文件之外,将它们放入单独的二进制文件(.mod 文件)中。创建库、目标文件等需要您 compile/link 它们在一起。

为什么这些语言编译其接口的方式存在细微差别?这只是两种语言的悠久历史导致的怪癖吗?

C 远没有你说的那么有条理。 "header"文件的使用纯属约定;预处理器允许任意文本包含,并且语言中没有 "interface" 和 "implementation" 的原则划分。

事情的简单事实是 linking 一个 C 程序的独立翻译单元没有被检查或 "safe"; 有责任将你 link 拼凑起来的部分。

在早期的 C 中,可以隐含函数声明,并且根本不检查函数参数。因此,您可以在代码中插入一个调用 foo(1, 2, 3),这意味着函数的声明 int foo(),并且参数需要与最终函数定义将使用的参数相匹配。

C 中使头文件有用的两个关键特性是 声明 函数原型 。如果您同意在使用前始终要求函数的显式声明(编译器会警告您),那么您可以在 "header file" 中提供该声明,并且 link 更适合.函数原型是声明概念的扩展,它会自动使用函数定义中的参数在调用点修复参数,因此如果您选择使用所有这些功能,您可以通过头文件合理地记录您的函数调用接口.但这一切都是约定俗成的!