程序使用中的接口与操作规则解析
立即解锁
发布时间: 2025-08-16 01:29:59 阅读量: 11 订阅数: 38 


Fortran 2003: 完整语法与特性指南
# 程序使用中的接口与操作规则解析
## 1. IMPORT 语句相关规则
在进行接口体操作时,IMPORT 语句有着特定的规则:
- 每个导入名称必须是接口体宿主中可访问实体的名称。如果是宿主的局部实体,它必须在接口体之前显式声明。
- 在 IMPORT 语句中命名的实体可通过宿主关联在接口体中访问。该名称不得出现在接口体中如 16.2.1.3 所述的阻止宿主关联的任何上下文中。
- 没有导入名称列表的 IMPORT 语句使每个宿主实体都可通过宿主关联访问,但 16.2.1.3 中所述阻止宿主关联的实体除外。如果接口体通过宿主关联访问宿主的局部实体,该实体必须在接口体之前显式声明。需要注意的是,一个不满足先前显式声明要求的实体仍被称为“可访问”,尽管实际上它无法被访问,这与“可访问”一词的正常英语含义相矛盾。这种“可访问性”的唯一作用是阻止在接口体中隐式声明同名实体。
## 2. 特定接口块
特定接口块为过程提供显式的特定接口。特定接口是针对特定过程的接口,同时也为相同的过程声明 EXTERNAL 属性。它可用于特定的外部过程、虚拟过程和过程指针,但不能用于内在、内部和模块过程,因为这些过程已经有显式接口。
特定接口块的形式如下:
```fortran
INTERFACE
[ interface-body ] ...
END INTERFACE
```
如果接口体的名称不是虚拟过程或指针的名称,则必须是外部过程的名称;接口的特征必须与外部过程的特征匹配,但对于纯过程可以指定非纯接口。需要注意的是,虚拟参数的名称不是特征,不需要匹配。
在同一个作用域单元中,一个过程不能有多个显式的特定接口。此外,一个过程的 EXTERNAL 属性不能在同一个作用域单元中既由接口体声明,又由其他方式声明。
## 3. 通用接口块
通用接口块为一组过程指定通用接口,还可以选择指定显式的特定接口。它可用于通用名称、定义的运算符、定义的赋值和定义的输入/输出。
通用接口块的一般形式为:
```fortran
INTERFACE generic-spec
[ interface-spec ] ...
END INTERFACE [ generic-spec ]
```
其中,通用规范(R1207)可以是以下之一:
- 通用名称
- OPERATOR( 定义的运算符 )
- ASSIGNMENT(=)
- READ (FORMATTED)
- READ (UNFORMATTED)
- WRITE (FORMATTED)
- WRITE (UNFORMATTED)
接口规范(R1202)可以是以下之一:
- 接口体
- 过程语句
过程语句(R1206)的形式(不要与过程声明语句混淆)为:
```fortran
[ MODULE ] PROCEDURE procedure-name-list
```
### 3.1 规则和限制
1. 如果 END INTERFACE 语句有通用规范,它必须与 INTERFACE 语句中的通用规范相同。为此,定义的运算符 <、<=、>、>=、== 和 /= 分别被视为与 .LT.、.LE.、.GT.、.GE.、.EQ. 和 .NE. 相同。
2. 由 PROCEDURE 语句指定的过程必须是当前作用域单元中具有显式接口的可访问过程。它可以是外部过程、模块过程、过程指针或虚拟过程。
3. 如果 PROCEDURE 语句有可选的 MODULE 关键字,则该语句指定的过程必须是模块过程。
4. 由接口体指定的过程必须是在当前作用域单元中否则不会有显式接口的可访问过程;接口体为该过程提供显式接口,该过程可以是外部过程、过程指针或虚拟过程。
5. 一个过程可以是多个通用的一部分,只要它分别满足每个通用的要求。由于前面的规则,最多只能有一个由接口体指定;其他的必须使用 PROCEDURE 语句。
6. 如果一个过程在当前作用域单元中先前已被指定为同一个通用的一部分,则不得再由 PROCEDURE 语句或接口体指定。
7. 在同一个作用域单元中,对于同一个通用可以有多个接口块。此外,同一个通用标识符可以通过宿主关联和从多个模块的使用关联进行访问。通过所有这些方式为通用指定的过程都是当前作用域单元中同一个通用的一部分。
由 PROCEDURE 语句或接口体指定的过程成为 INTERFACE 语句指定的通用的一部分。此外,由接口体指定的过程以与特定接口块相同的方式获得显式接口。
需要注意的是,PROCEDURE 语句中的 MODULE 关键字除了添加限制外没有其他效果。在新代码中很少有理由使用这个关键字,它主要是为了与现有代码兼容。
下面通过一个示例来说明规则 6 和 7 的交互:
```fortran
module intrinsic_types_module
interface display
procedure :: display_integer, display_real
end interface
...
end module
module my_type_1_module
use intrinsic_types_module
interface display
procedure :: display_my_type_1
end interface
...
end module
module my_type_2
use intrinsic_types_module
interface display
procedure :: display_my_type_2
end interface
...
end module
program main
use intrinsic_types_module, my_type_1_module, my_type_2_module
...
end program
```
第一个模块定义了一个名为 display 的通用,包含用于显示一些内在类型的特定过程。接下来的两个模块独立地扩展了这个通用,为两个派生类型添加了特定过程。主程序使用了所有三个模块,合并了它们的通用。由于是通过使用关联进行的,所以 display_integer 和 display_real 的冗余指定是允许的。
## 4. 通用过程名称
通用过程名称的一个简单示例是内在函数 INT:
```fortran
INT(R)
INT(D)
```
其中 R 和 D 分别是默认实型和双精度对象。看起来这里只涉及一个过程(INT),但实际上有两个。有一个特定过程接受默认实型参数,另一个接受双精度参数。由于这两个过程的目的非常相似,因此希望用同一个通用名称来引用它们,这有时被称为名称重载。参数的类型足以确定在给定引用中涉及哪个特定过程。
通用是指一组具有相同通用名称的不同特定过程。所有的内在过程都是通用的,用户可以定义额外的通用或为内在通用添加额外的特定过程。实现这一点的机制是一个通用接口块,其通用规范是一个通用名称。
一个这样的
0
0
复制全文