在 C 和 C++ 中传递自变量
C 和 C++ 语言中的自变量在运行时复制到程序堆栈,在该程序堆栈中,这些自变量由函数读取。 这些参数可以是本身的值,也可以是指向包含要传递的数据的内存区域的指针。 传递指针也称为传递值 按引用。
其他语言 (例如 COBOL 和 PL/I) 通常通过引用传递其自变量,这意味着编译器传递指向要传递的自变量的地址列表。 这是 CICS®支持的调用接口。 要通过引用传递参数,请使用 & 作为变量名称的前缀,除非它已经是指针,如传递数组时一样。
作为构建过程的一部分,编译器可以将自变量从一种数据类型转换为另一种数据类型。 例如,类型为 char 的自变量可以转换为类型 short 或类型 long。
将值从 C 或 C++ 程序发送到 CICS时,转换程序将执行必要的操作以生成代码,从而将正确格式的参数列表传递到 CICS。 转换程序并非总是有足够的信息使其能够执行此操作,但通常,如果自变量是单字符或半字变量,那么转换程序会对正确数据类型的变量进行预先赋值,并在调用中传递此临时变量的地址。
从 CICS接收数据时,转换程序会使用 & 作为接收变量名称的前缀,这将导致 C 或 C++ 编译器向其传递值 按引用 而不是 按值 (字符串名称除外,字符串名称保持不变)。 如果不添加 & ,那么编译器将复制接收变量,然后将该副本的地址传递到 CICS。 在此复制期间发生的任何提升都可能导致 CICS 返回的数据丢失。
表 1 显示了在 EXEC CICS 命令中作为自变量传递值时适用的规则。
| 数据类型 | 用法 | 对自变量进行编码 |
|---|---|---|
| 字符文字 | 数据值 (发送方) | 用户必须直接指定字符文字。 转换程序将处理任何必需的 indirection。 |
| 字符变量 (char) | 数据区 (接收方) | 用户必须指定指向变量的指针,可以使用 &作为变量名称的前缀。 |
| 字符变量 (char) | 数据值 (发送方) | 用户必须直接指定字符变量。 转换程序将处理任何必需的 indirection。 |
| 字符串文字 | 名称 (发件人) | 用户可以直接将字符串编码为文字字符串,或者使用指向字符串的第一个字符的指针。 |
| 字符串变量 | 数据区 (接收方) 名称 (发送方) | 无论接收还是发送,自变量都应该是包含字符串的字符数组的名称-数组的第一个元素的地址。 |
| 整数变量 (short , long 或 int) | 数据区 (接收方) | 用户必须指定指向变量的指针,可以使用 &作为变量名称的前缀。 |
| 整数变量 (short , long 或 int) | 数据值 (发送方) | 用户必须指定变量的名称。 转换程序将在需要的任何 indirection 之后进行查找。 |
| 整数常量 (短整型,长整型或整型) | 数据值 (发送方) | 用户必须直接指定整数常量。 转换程序将处理任何必需的 indirection。 |
| 结构或联合 | 数据区 (发送方) 数据区 (接收方) | 用户必须对结构或并集开头的地址进行编码,可能是通过使用 &作为其名称的前缀。 |
| 数组 (任何内容) | 数据区 (接收方) 数据值 (发送方) | 转换程序不执行任何操作。 必须对阵列的第一个成员的地址进行编码。 这通常是通过对数组的名称进行编码来完成的,编译器将该名称解释为第一个成员的地址。 |
| 指针 (指向任何对象) | Ptr-ref (接收方) 数据区 (发送方) | 无论接收还是发送,自变量都应该是表示相关地址的变量的名称。 转换程序将处理允许 CICS 更新指针所必需的额外的 indirection 级别。 |
注: 接收方是从 CICS接收数据的位置; 发送方是将数据传递到 CICS的位置。