C 和 C++ 编程限制和要求

某些限制和要求适用于用作 CICS® 应用程序的 C 或 C++ 程序。

无法使用的函数和命令

C 和 C++ 应用程序不支持与非结构化异常处理相关的以下 EXEC CICS 命令:
  • HANDLE ABEND LABEL(label)
  • HANDLE AID
  • HANDLE CONDITION
  • IGNORE CONDITION
  • PUSH HANDLE
  • POP HANDLE
转换程序会诊断是否使用了这些命令。 允许使用 HANDLE ABEND PROGRAM 命令。

CICS 不支持 system () 函数,但是两个 CICS 命令 LINKXCTL 提供了等效的函数。

CICS 不支持扩展精度浮点。

C++ 不支持压缩十进制数据。 应用程序有权使用字符串数据类型来访问压缩十进制数据。 没有 C++ 标准库函数可用于对此数据执行算术,但您可以编写自己的函数。 使用具有用于指定时间的选项 (例如, DELAYPOST 命令) 的 CICS 命令时,建议使用 HOURS , MINUTES 和 SECONDS 选项。 如果您提供在应用程序中处理时间的函数,那么可以使用压缩十进制数据类型的 TIME 或 INTERVAL 选项来定义时间。

C 和 C++ 不支持在宏中使用 CICS 命令。

本机 C 或 C++ 文件操作仅对在指定了 type=memory 的情况下打开的文件执行。 对 CICS支持的访问方法的 I/O 必须使用 CICS API。

在源程序中允许所有本机 C 和 C++ 函数,但建议不要使用以下函数。 某些是不可执行的,并导致返回码或指针指示函数已失败。 某些操作可能起作用,但可能会影响 CICS的性能或执行。
  • CDUMP
  • CSNAP
  • CTEST
  • CTRACE
  • CLOCK (时钟 () 函数返回值 (time_t) -1。)
  • CTDLI
  • SVC99
  • SYSTEM
  • setLocale

编码要求

  • 您可以混合输入所有 CICS 关键字,但 #pragma 伪指令上的 CICS 关键字除外,这些关键字必须仅为大写。
  • 其中, CICS 需要固定长度的字符串 (例如,程序名,映射名或队列名) ,如果该字面值的长度比预期短,那么必须用空格填充该字面值,直至达到所需长度。 对于 EXEC DLI 命令,如果传递了文字,那么转换程序将填充 SEGMENT 名称。
  • 请勿使用汇编程序可接受的字段名称,但这会导致 C 或 C++ 编译器异常终止。 这些名称包括 $, # 和 @。
  • C++ 将 "//" 用于单行注释。 请勿将此类注释放在 EXEC CICS 命令的中间。 例如,以下代码无效:
    EXEC CICS SEND TEXT FROM(errmsg)
    LENGTH(msglen) // Send error message to screen
    RESP(rcode)
    RESP2(rcode2);
    以下代码示例有效:
    EXEC CICS SEND TEXT FROM(errmsg)
    LENGTH(msglen)
    RESP(rcode)
    RESP2(rcode2); //Send error message to screen
    EXEC CICS SEND TEXT FROM(errmsg)
    LENGTH(msglen) /* Send error message to screen */
    RESP(rcode)
    RESP2(rcode2);

条件处理

在 C 或 C++ 应用程序中,每个 EXEC CICS 命令都被视为指定了 NOHANDLE 或 RESP 选项。 因此, 系统操作 事务的集合会异常终止,这是由于发生了某个条件而导致的,但无法进行处理。 控制始终流至下一个指令,应用程序负责测试正常响应。

COMMAREA

通信区域的地址未作为自变量传递给 C 或 C++ 主函数。 这意味着 C 和 C++ 函数必须使用 ADDRESS COMMAREA 来获取通信区的地址。

EIB

EXEC 接口块 (EIB) 的地址未作为自变量传递至 C 或 C++ 主函数。 这意味着 C 和 C++ 函数必须使用 ADDRESS EIB 来获取 EIB 的地址。 请参阅 从 C 和 C++ 访问 EIB 以获取更多信息。

LENGTH

If you do not specify the LENGTH option on commands that support LENGTH (for example, READ , READNEXT , READPREV , and WRITE commands), the translator does not supply a default value. 实际上, NOLENGTH 对于 C 程序是隐式的。

OVERFLOW 条件

如果希望在从带有 ACCUM 选项的 SEND MAP 命令返回时在 RESP 字段中指示任何 OVERFLOW 条件,那么应指定 NOFLUSH 选项。

寻址方式

在 CICS 下运行的所有 C 和 C++ 语言程序都必须使用属性 AMODE (31) 和 RMODE (ANY) 进行链接编辑。 它们可以位于 16 MB 界线之上。
因此,将参数传递到由跨系统产品 (CSP) 交互式应用程序生成器生成的程序时,必须执行下列其中一项操作:
  • 传递低于 16 MB 的参数
  • 将 CSP 装入库与 AMODE (31) 重新链接

C 和 C++ 语言程序不支持 64 位寻址方式 (AMODE (64))。

64 位驻留方式

CICS 不支持 64 位驻留方式 (RMODE (64)) ,并将任何 RMODE (64) 程序视为 RMODE (31)。 即,将 RMODE (64) 程序装入到 31 位 (界线以上) 存储器中,而不是 64 位 (界线以上) 存储器中。

返回值

如果使用 exit () 函数或 return 语句 (而不是 CICS RETURN 命令) 终止 C 或 C++ 程序,那么从程序返回时,通过 exit () 函数传递的值将保存在 EIB 的 EIBRESP2 字段中。
注: 如果程序使用 DPL 链接到另一个 CICS 区域中的程序,那么来自远程区域的 EIBRESP2 值 不会 返回到执行 DPL 的程序。

数据声明

CICS for C 和 C++ 提供了以下数据声明:
  • 执行接口块定义 (EIB)。 EIB 声明包含在 #ifndef 和 #endif 行中,并且包含在所有已翻译的文件中。 C 或 C++ 编译器忽略重复的声明。 插入的代码包含以 C 和 C++ 编码的 EIB 中所有字段的定义。
  • BMS 屏幕属性定义 :C 和 C++ 版本的 DFHBMSCA , DFHMSRCA 和 DFHAID 文件由 CICS提供,并且可以由应用程序员在使用 BMS 时包含。
  • DL/I 支持: 如果已指定转换程序选项,那么 DLI 转换程序将包含 DFHDIB 的 C 语言版本。 (如果使用了 CALL DLI 接口,那么必须包含 DLIUIB。)

Fetch 函数

语言环境 ®-符合程序支持 fetch () 和 release () 函数。 必须将要访存的模块定义为 CICS的 PROGRAM 资源 (显式或隐式地通过自动安装)。

语言环境函数

已在 CSD 中定义的语言环境支持所有语言环境函数。 setlocale () 函数返回 NULL (如果未定义语言环境)。

调试函数

支持转储函数 csnap () , cdump () 和 ctrace ()。 输出将发送到 CESE 瞬时数据队列。 如果队列没有足够的记录长度 (LRECL) ,那么无法写入转储。 建议至少使用 161 的 LRECL。

iscics 函数

iscics () 函数在您调整现有程序或编写旨在在 CICS 外部以及 CICS下运行的新程序时很有用。 如果您的程序当前正在 CICS下运行,那么此函数将返回非零值,否则返回零。 此函数是 C 库的扩展。

字符串处理函数

C 或 C++ 标准库中的字符串处理函数使用空字符作为字符串结束标记。 由于 CICS 无法将空值识别为字符串结束标记,因此在使用 C 或 C++ 函数 (例如 strcmp) 对 CICS 数据区进行操作时必须小心。

argc 和 argv 参数

两个自变量 (argc 和 argv) 通常传递给 C 或 C++ 主函数。 argc 表示传递了多少个变量 ;argv 是一个由零终止的变量字符串组成的数组。 在 CICS中, argc 的值为 1 , argv [0] 是事务标识, argv [1] 为 NULL。