Я пытаюсь понять, как включить определения HLASM и Metal C для одного и того же DSECT/структуры в один набор данных/файл.
Прежде чем попробовать это, я попробовал то, что описал в Как мне заставить это работать с помощью #include? Он отлично работает, если вставить его прямо в код
Итак, я пошел другим путем и решил, что могу использовать #define, чтобы изменить оператор MACRO в ассемблере на что-то, что будет использовать компилятор C:
- Измените «MACRO» на «#pragma margins (2,72)».
Измените «ИСПРАВИТЬ» на «#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. Собственно говоря, есть несколько слов об операторах # и ##...
Есть ли способ обойти это?
Спасибо, Скотт
SHOWINC
. Это расширит#include
в списке. Однако у меня могут быть плохие новости. Правильный синтаксис для#pragma
—#pragma options(blah)
Но в doc, MARGINS не указан. - person zarchasmpgmr   schedule 07.10.2019#define
: объектоподобное определение макроса заменяет один идентификатор указанными токенами замены. Идентификатор — это имя для одного из следующих элементов языка: функции, объекты, метки, параметры функций, макросы и параметры макросов, определения типов, перечисляемые типы и перечислители, а также имена структур и объединений. # прагма — это директива препроцессора, которая не является идентификатором. Я думаю, что компилятор интерпретирует это как часть программы, а не предварительную обработку, что соответствует документу. - person zarchasmpgmr   schedule 08.10.2019