我试图弄清楚如何在单个数据集/文件中为同一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编译器将使用的内容:
将“ 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中使用“#”的内容。事实上,关于#和##运算符有些话……
有没有办法解决这个问题?
谢谢, 斯科特
答案 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标头。