我正在尝试弄清楚如何在单个数据集/文件中包含相同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 标头。