尝试在z / OS HLASM和XL C / C ++ metal C编译器之间创建“双语宏”

时间:2019-10-07 19:30:58

标签: c zos xlc mvs metalc

我试图弄清楚如何在单个数据集/文件中为同一DSECT /结构同时包含HLASM和Metal C定义。

在尝试此操作之前,我尝试过How do I go about making this work with a #include? It works fine when dropped straight into the code中描述的内容

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

  • 将“宏”更改为“ #pragma margins(2,72)”
  • 将“ MEND”更改为“ #pragma nomargins”

    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中使用“#”的内容。事实上,关于#和##运算符有些话……

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

谢谢, 斯科特

1 个答案:

答案 0 :(得分:2)

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的映射,并使您能够维护一个定义。您的makefile会有一条额外的规则,可以使用dsect工具从hlasm代码创建C标头。