在语言之间传递字符类型
语言间调用的一个难点是在语言之间传递字符串。
困难是由于不同语言表示此类实体的方式存在以下潜在差异:
- Fortran 中唯一的字符类型是 CHARACTER,它存储为一组连续字节,每个字节一个字符。 长度未存储为实体的一部分。 相反,当实体作为参数传递时,它在声明的参数列表的末尾作为额外的参数按值传递。 自变量的大小为 4 或 8 字节,具体取决于使用的编译方式 (分别为 32 位或 64 位)。
- C 中的字符串存储为 char类型的数组。 空字符指示字符串的结束。注: 要使编译器自动将空字符添加到某些字符自变量,可以使用 -qnullterm 选项。
如果要编写混合语言程序的两个部分,那么可以使 C 例程处理额外的 Fortran 长度自变量,也可以通过使用 %REF 函数传递字符串来抑制此额外自变量。 如果使用 %REF(通常用于预先存在的 C 例程) ,那么需要通过将空字符并置到传递到 C 例程的每个字符串的末尾来指示字符串的结束位置:
! Initialize a character string to pass to C.
character*6 message1 /'Hello\0'/
! Initialize a character string as usual, and append the null later.
character*5 message2 /'world'/
! Pass both strings to a C function that takes 2 (char *) arguments.
call cfunc(%ref(message1), %ref(message2 // '\0'))
end为了与 C 语言用法兼容,您可以在 Open XL Fortran 字符串中对以下转义序列进行编码:
| 转义 | 含义 |
|---|---|
| \b | 退格键 |
| \f | 换页 |
| \n | 换行 |
| \t | 制表符 |
| \0 | 空 |
| \' | 撇号(不终止字符串) |
| \" | 双引号(不终止字符串) |
| \ \ | 反斜杠 |
| \x | x,其中 x 是任何其他字符(将忽略反斜杠) |
如果不希望反斜杠被解释为字符串中的转义字符,那么可以使用 -qnoescape 选项进行编译。