尝试在 z/OS HLASM 和 XL C/C++ metal C 编译器之间建立"bilingual macros"



我正在尝试弄清楚如何在单个数据集/文件中包含相同DSECT/结构的HLASM和Metal C定义。

在尝试此操作之前,我尝试了如何在使用 #include 进行这项工作?直接放入代码中时工作正常

因此,我走上了另一条路,并认为我可以使用 #define 将汇编程序中的 MACRO 语句更改为 C 编译器将使用的内容:

  • 将"宏"更改为"#pragma 边距(2,72(">
  • 将"修补"更改为"#pragma 无边距">

    EDIT       SSAF.METALC.H(CKKTEST) - 01.01                          Columns 00001 00080 
    Command ===>                                                          Scroll ===> CSR  
    ****** ********************************* Top of Data **********************************
    000001          MACRO                                                                  
    000002 */* First line of macro prolog                                       */         
    000003 */* Last line of macro prolog                                        */         
    000004 *#if 0!=0                               // Bypass asm in C                      
    000005 Test     DSECT                                                                  
    000006 Test@    DS A                                                                   
    000007 TestINT  DS F                                                                   
    000008 TestChar DS C                                                                   
    000009 *#endif                                                                         
    000010  MEND                                                                           
    000011 struct Test {                                                                   
    000012   void *Test@;                                                                  
    000013   int TestInt;                                                                  
    000014   char TestChar;                                                                
    000015 };                                                                              
    ****** ******************************** Bottom of Data ********************************
    

我想我可以使用 #define 将"MACRO"和"MEND"更改为C编译器想要的东西,首先我尝试不带引号:

EDIT       SSAF.METALC.C(CKLTHING) - 01.01                         Columns 00001 00080 
Command ===>                                                          Scroll ===> CSR  
000207 #define MACRO #pragma margins(2,72)                                          
000208 #define MEND #pragma nomargins                                              
000209 #include"ckktest.h"                                                             

没有产生预期的结果:

|
207       |#define MACRO #pragma margins(2,72)                                         
208       |#define MEND #pragma nomargins                                              
209       |#include"ckktest.h"                                                         
*=ERROR===========>     CCN3191 The character # is not a valid C source character.       
*=ERROR===========>     CCN3166 Definition of function pragma requires parentheses.      
*=ERROR===========>     CCN3191 The character # is not a valid C source character.       
*=ERROR===========>     CCN3191 The character # is not a valid C source character.       
*=ERROR===========>     CCN3191 The character # is not a valid C source character.       
*=ERROR===========>     CCN3276 Syntax error: possible missing '{'?                                            

然后我尝试将 #define 值括在引号中:

207       |#define MACRO "#pragma margins(2,72)"                                       
208       |#define MEND "#pragma nomargins"                                            
209       |#include"ckktest.h"                                                         
*=ERROR===========>     CCN3191 The character # is not a valid C source character.       
*=ERROR===========>     CCN3191 The character # is not a valid C source character.       
210       |                                                                            

这提供了较少的错误消息,但仍然不是我需要的。

注意:我使用的#是EBCDIC 7B。

错误消息的描述相当简洁:

CCN3191 字符 &1 不是有效的 C 源字符。 解释 有关有效字符的信息,请参阅 C/C++ 语言参考。

在消息文本中:

&1 是一个字符。

用户响应 更改字符。

我参考了 C/C++ 语言参考,找不到任何说我不能在 #define 中使用"#"的内容。事实上,有一些关于#和##运算符的话......

有没有办法解决这个问题?

谢谢 斯科特

Scott,问题是宏不能扩展到预处理指令。 我从标题中猜测您想在一个地方定义结构定义并在 hlasm 和 C/C++ 中使用它。 我建议查看 dsect 工具。 此工具从 hlasm 文件中的 DSECT 声明生成 C 结构声明。 这可以给出一个解决方案。

使用宏技巧的另一个选项是 ckktest.h 的类似内容:

StructStart(Test)
MbrAddr(Test@)
MbrInt(TestINT)
MbrByte(TestChar)
StructEnd

在 C 源中,您将包含:

#define StructStart(s) struct s {
#define MbrAddr(m) void *m;
#define MbrInt(m) int m;
#define MbrByte(m) char m;
#define StructEnd };
#include "ckktest.h"

并且在赫拉斯姆中趋于相似。

我会看看 dsect 工具,因为它会给出从 hlasm 到 C 的映射,并使您能够维护一个定义。 您的生成文件将有一个额外的规则,用于使用 dsect 工具从 hlasm 代码创建 C 标头。

相关内容

  • 没有找到相关文章

最新更新