C 编程

用于帮助您使用来自 C 编程语言的 MQI 的信息。

头文件

表 1. C 头文件
文件 内容
CMQC 主 MQI 的函数原型,数据类型和命名常量
CMQXC 数据转换出口的函数原型,数据类型和命名常量
CMQEC 主要 MQI ,数据转换出口和接口入口点结构的函数原型,数据类型和命名常量 (CMQEC 包括 CMQXC 和 CMQC。)
CMQSTRC 将 MQI 常量定义转换为等效文本的函数。
[z/OS]注意: 适用于 IBM® MQ 9.1中的 z/OS® 。 使用此头文件的程序必须使用 LONGNAME 编译器选项进行编译。
为提高应用程序的可移植性,请在 #include 预处理器伪指令上以小写形式对头文件名称进行编码:
#include "cmqec.h"

函数

您不需要指定每次调用函数时由地址传递的所有参数。

  • 按值传递 仅输入 且类型为 MQHCONN , MQHOBJ 或 MQLONG 的参数。
  • 按地址传递所有其他参数。

如果不需要特定参数,请使用空指针作为函数调用上的参数,以代替参数数据的地址。 可以进行此操作的参数在调用描述中被识别。

未返回任何参数作为函数的值; 在 C 术语中,这意味着所有函数都返回 void

函数的属性由 MQENTRY 宏变量定义;此宏变量的值取决于环境。

具有未定义数据类型的参数

MQGET , MQPUT 和 MQPUT1 函数上的 Buffer 参数具有未定义的数据类型。 此参数用于发送和接收应用程序的消息数据。

此类参数在 C 示例中显示为 MQBYTE 的数组。 您可以通过这种方式声明参数,但通常更便于将它们声明为描述消息中数据布局的特定结构。 将实际函数参数声明为指向空的指针,并将任何类型的数据的地址指定为函数调用上的参数。

数据类型

使用 C typedef 语句定义所有数据类型。 对于每种数据类型,还定义相应的指针数据类型。 指针数据类型的名称是以字母 P(表示指针)为前缀的基本或结构数据类型的名称。 使用 MQPOINTER 宏变量定义指针的属性; 此宏变量的值取决于环境。 下面说明了如何声明指针数据类型:
#define MQPOINTER *                /* depends on environment */
...
typedef MQLONG MQPOINTER PMQLONG;  /* pointer to MQLONG */
typedef MQMD   MQPOINTER PMQMD;    /* pointer to MQMD */

处理二进制字符串

将二进制数据的字符串声明为 MQBYTEn 数据类型之一。

每当复制,比较或设置此类型的字段时,请使用 C 函数 memcpymemcmpmemset ; 例如:
#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));

请勿使用字符串函数 strcpystrcmpstrncpystrncmp,因为这些函数无法正确用于使用 MQBYTEn 数据类型声明的数据。

处理字符串

当队列管理器将字符数据返回到应用程序时,队列管理器始终根据字段的已定义长度来使用空白填充字符数据。 队列管理器 返回以 null 结束的字符串。

因此,在复制,比较或并置此类字符串时,请使用字符串函数 strncpystrncmpstrncat

请勿使用要求字符串由 null (strcpystrcmpstrcat) 终止的字符串函数。 此外,请勿使用函数 strlen 来确定字符串的长度; 而是使用 sizeof 函数来确定字段的长度。

结构的初始值

头文件定义各种宏变量,当您声明这些结构的实例时,可以使用这些宏变量为 MQ 结构提供初始值。

这些宏变量具有 MQxxx_DEFAULT 形式的名称,其中 MQxxx 表示结构的名称。 它们的使用方式如下:
MQMD   MyMsgDesc = {MQMD_DEFAULT};
MQPMO  MyPutOpts = {MQPMO_DEFAULT};
对于某些字符字段 (例如,大多数结构中出现的 StrucId 字段或 MQMD 中出现的 Format 字段) , MQI 定义了有效的特定值。 对于每个有效值,将提供 两个 宏变量:
  • 一个宏变量将值定义为具有长度的字符串,但不包括隐含的空匹配项,这正好是定义的字段长度。 例如,对于 MQMD 中的 Format 字段,提供了以下宏变量 (¬ 表示单个空白字符):
    #define MQFMT_STRING "MQSTR¬¬¬"
    
    将此表单与 memcpymemcmp 函数配合使用。
  • 另一个宏变量将值定义为字符数组; 此宏变量的名称是以 _ARRAY 为后缀的字符串格式的名称。 例如:
    #define MQFMT_STRING_ARRAY 'M','Q','S','T','R','¬','¬','¬'
    
    当您声明具有与 MQMD_DEFAULT 宏变量提供的值不同的值的结构实例时,请使用此表单来初始化该字段。 (这并非总是必要的; 在某些环境中,您可以在这两种情况下都使用值的字符串形式。 但是,您可以将数组表单用于声明,因为这是与 C++ 编程语言兼容所必需的。)

动态结构的初始值

当需要可变数量的结构实例时,通常会在使用 callocmalloc 函数动态获取的主存储器中创建这些实例。 要初始化此类结构中的字段,请考虑以下方法:
  1. 使用相应的 MQxxx_DEFAULT 宏变量声明结构的实例以初始化该结构。 此实例将成为其他实例的模型:
    MQMD Model = {MQMD_DEFAULT}; /* declare model instance */
    
    可以在声明上对 staticauto 关键字进行编码,以便根据需要提供模型实例静态或动态生存期。
  2. 使用 callocmalloc 函数来获取结构的动态实例的存储器:
    PMQMD Instance;
    Instance = malloc(sizeof(MQMD)); /* get storage for dynamic instance */
    
  3. 使用 memcpy 函数将模型实例复制到动态实例:
    memcpy(Instance,&Model,sizeof(MQMD)); /* initialize dynamic instance */
    

从 C++ 使用

对于 C++ 编程语言,头文件包含仅在使用 C++ 编译器时包含的以下附加语句:
#ifdef __cplusplus
  extern "C" {
#endif

/* rest of header file */

#ifdef __cplusplus
  }
#endif

表示法约定

此信息显示如何调用函数和声明参数。

在某些情况下,参数是大小不固定的数组。 对于这些,使用小写 n 来表示数字常量。 当您对该参数的声明进行编码时,请将 n 替换为所需的数字值。