1

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

在尝试此操作之前,我尝试了我在如何使用#include 进行这项工作中描述的内容?直接放入代码中时效果很好

所以,我走了另一条路,并想我可以使用#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 中使用“#”的内容。事实上,关于 # 和 ## 运算符有一些话......

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

谢谢,斯科特

4

1 回答 1

2

斯科特,问题是宏不能扩展到预处理指令。我从标题中猜测您想在一个地方定义结构定义并在 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"

并且在hlasm中趋于相似。

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

于 2019-10-08T03:01:38.827 回答