Попытка создать "двуязычные макросы" между z / OS HLASM и XL C / C ++ metal C компилятором - PullRequest
1 голос
/ 07 октября 2019

Я пытаюсь выяснить, как включить определения HLASM и Metal C для одного и того же DSECT / struct в один набор данных / файл.

Прежде чем попробовать это, я попробовал то, что описал в Как мне сделать эту работу с #include? Он отлично работает, когда попадает прямо в код

Итак, я пошел по другому пути и решил, что могу использовать #define, чтобы изменить инструкцию MACRO в ассемблере на что-то, что будет использовать компилятор C:

  • Измените "MACRO" на "#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 Ответ

2 голосов
/ 08 октября 2019

Скотт, проблема в том, что макрос не может расширяться до директив предварительной обработки. Я думаю, из заголовка вы хотите определить определение структуры в одном месте и использовать его в hlasm и C / C ++. Я предлагаю посмотреть на инструмент dsect. Этот инструмент создает объявление структуры C из объявлений DSECT в файле hlasm. Это может дать решение.

Другой вариант, использующий трюки с макросами, выглядит примерно так:

И, как правило, похожи в hlasm.

Я бы посмотрел на инструмент dsect, так как он даст отображение от hlasm до C и позволит вам сохранить одно определение. Ваш make-файл будет иметь одно дополнительное правило для создания заголовка C из кода hlasm с помощью инструмента dsect.

...