C 编程
用于帮助您使用来自 C 编程语言的 MQI 的信息。
头文件
| 文件 | 内容 |
|---|---|
| CMQC | 主 MQI 的函数原型,数据类型和命名常量 |
| CMQXC | 数据转换出口的函数原型,数据类型和命名常量 |
| CMQEC | 主要 MQI ,数据转换出口和接口入口点结构的函数原型,数据类型和命名常量 (CMQEC 包括 CMQXC 和 CMQC。) |
| CMQSTRC | 将 MQI 常量定义转换为等效文本的函数。 注意: 适用于 IBM® MQ 9.1中的 z/OS® 。 使用此头文件的程序必须使用 LONGNAME 编译器选项进行编译。 |
#include "cmqec.h"
函数
您不需要指定每次调用函数时由地址传递的所有参数。
- 按值传递 仅输入 且类型为 MQHCONN , MQHOBJ 或 MQLONG 的参数。
- 按地址传递所有其他参数。
如果不需要特定参数,请使用空指针作为函数调用上的参数,以代替参数数据的地址。 可以进行此操作的参数在调用描述中被识别。
未返回任何参数作为函数的值; 在 C 术语中,这意味着所有函数都返回 void。
函数的属性由 MQENTRY 宏变量定义;此宏变量的值取决于环境。
具有未定义数据类型的参数
MQGET , MQPUT 和 MQPUT1 函数上的 Buffer 参数具有未定义的数据类型。 此参数用于发送和接收应用程序的消息数据。
此类参数在 C 示例中显示为 MQBYTE 的数组。 您可以通过这种方式声明参数,但通常更便于将它们声明为描述消息中数据布局的特定结构。 将实际函数参数声明为指向空的指针,并将任何类型的数据的地址指定为函数调用上的参数。
数据类型
#define MQPOINTER * /* depends on environment */
...
typedef MQLONG MQPOINTER PMQLONG; /* pointer to MQLONG */
typedef MQMD MQPOINTER PMQMD; /* pointer to MQMD */
处理二进制字符串
将二进制数据的字符串声明为 MQBYTEn 数据类型之一。
#include <string.h>
#include "cmqc.h"
MQMD MyMsgDesc;
memcpy(MyMsgDesc.MsgId, /* set "MsgId" field to nulls */
MQMI_NONE, /* ...using named constant */
sizeof(MyMsgDesc.MsgId));
memset(MyMsgDesc.CorrelId, /* set "CorrelId" field to nulls */
0x00, /* ...using a different method */
sizeof(MQBYTE24));
请勿使用字符串函数 strcpy, strcmp, strncpy或 strncmp,因为这些函数无法正确用于使用 MQBYTEn 数据类型声明的数据。
处理字符串
当队列管理器将字符数据返回到应用程序时,队列管理器始终根据字段的已定义长度来使用空白填充字符数据。 队列管理器 不 返回以 null 结束的字符串。
因此,在复制,比较或并置此类字符串时,请使用字符串函数 strncpy, strncmp或 strncat。
请勿使用要求字符串由 null (strcpy, strcmp, strcat) 终止的字符串函数。 此外,请勿使用函数 strlen 来确定字符串的长度; 而是使用 sizeof 函数来确定字段的长度。
结构的初始值
头文件定义各种宏变量,当您声明这些结构的实例时,可以使用这些宏变量为 MQ 结构提供初始值。
MQMD MyMsgDesc = {MQMD_DEFAULT};
MQPMO MyPutOpts = {MQPMO_DEFAULT};
StrucId 字段或 MQMD 中出现的 Format 字段) , MQI 定义了有效的特定值。 对于每个有效值,将提供 两个 宏变量:- 一个宏变量将值定义为具有长度的字符串,但不包括隐含的空匹配项,这正好是定义的字段长度。 例如,对于 MQMD 中的
Format字段,提供了以下宏变量 (¬表示单个空白字符):
将此表单与 memcpy 和 memcmp 函数配合使用。#define MQFMT_STRING "MQSTR¬¬¬" - 另一个宏变量将值定义为字符数组; 此宏变量的名称是以 _ARRAY 为后缀的字符串格式的名称。 例如:
当您声明具有与 MQMD_DEFAULT 宏变量提供的值不同的值的结构实例时,请使用此表单来初始化该字段。 (这并非总是必要的; 在某些环境中,您可以在这两种情况下都使用值的字符串形式。 但是,您可以将数组表单用于声明,因为这是与 C++ 编程语言兼容所必需的。)#define MQFMT_STRING_ARRAY 'M','Q','S','T','R','¬','¬','¬'
动态结构的初始值
- 使用相应的 MQxxx_DEFAULT 宏变量声明结构的实例以初始化该结构。 此实例将成为其他实例的模型:
可以在声明上对 static 或 auto 关键字进行编码,以便根据需要提供模型实例静态或动态生存期。MQMD Model = {MQMD_DEFAULT}; /* declare model instance */ - 使用 calloc 或 malloc 函数来获取结构的动态实例的存储器:
PMQMD Instance; Instance = malloc(sizeof(MQMD)); /* get storage for dynamic instance */ - 使用 memcpy 函数将模型实例复制到动态实例:
memcpy(Instance,&Model,sizeof(MQMD)); /* initialize dynamic instance */
从 C++ 使用
#ifdef __cplusplus
extern "C" {
#endif
/* rest of header file */
#ifdef __cplusplus
}
#endif
表示法约定
此信息显示如何调用函数和声明参数。
在某些情况下,参数是大小不固定的数组。 对于这些,使用小写 n 来表示数字常量。 当您对该参数的声明进行编码时,请将 n 替换为所需的数字值。
![[z/OS]](ngzos.gif)