在语言之间传递字符类型

语言间调用的一个难点是在语言之间传递字符串。

困难是由于不同语言表示此类实体的方式存在以下潜在差异:
  • 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 字符串中对以下转义序列进行编码:

表 1. 字符串的转义序列
转义 含义
\b 退格键
\f 换页
\n 换行
\t 制表符
\0
\' 撇号(不终止字符串)
\" 双引号(不终止字符串)
\ \ 反斜杠
\x x,其中 x 是任何其他字符(将忽略反斜杠)

如果不希望反斜杠被解释为字符串中的转义字符,那么可以使用 -qnoescape 选项进行编译。