问题
I have a block of code that I want to #include in my z/OS Metal C program, it works fine when it's just part of the program, but when I put it into a .h file and #include it, the code won't compile.
I have successfully gotten this code to work without #include. I'm sure I'm overlooking something having to do with #include...
This code works:
    #pragma margins(2,72)                                                  
    *#if 0!=0                                                              
    Test     DSECT                                                         
    Test@    DS A                                                          
    TestINT  DS F                                                          
    TestChar DS C                                                          
     .ago end                                                              
    *#endif                                                                
    *struct Test {                                                         
    *  void *Test1;                                                        
    *  int TestInt;                                                        
    *  char TestChar;                                                      
    *};                                                                    
    *#if 0!=0                                                              
    .end                                                                   
     MEND                                                                  
    *#endif                                                                
     #pragma nomargins
Giving compiler output that looks like this:
      207       |#pragma margins(2,72)                                            
      207       +                                                                 
      208       |#if 0!=0                                                         
      214       |#endif                                                           
      215       |struct Test {                                                    
      216       |  void *Test1;                                                   
    5650ZOS V2.1.1 z/OS XL C                          'SSAF.METALC.C(CKKTHING)'   
                                              * * * * *   S O U R C E   * * * * * 
     LINE  STMT                                                                   
                 *...+....1....+....2....+....3....+....4....+....5....+....6....+
      217       |  int TestInt;                                                   
      218       |  char TestChar;                                                 
      219       |};                                                               
      220       |#if 0!=0                                                         
      223       |#endif                                                           
      224       |#pragma nomargins                                                                                                    
But, when I put the code into an #include file like this:
    EDIT       SSAF.METALC.H(CKKTEST)
    Command ===>                     
    ****** **************************
    000001 *#if 0!=0                 
    000002 Test     DSECT            
    000003 Test@    DS A             
    000004 TestINT  DS F             
    000005 TestChar DS C             
    000006  .ago end                 
    000007 *#endif                   
    000008 *struct Test {            
    000009 *  void *Test1;           
    000010 *  int TestInt;           
    000011 *  char TestChar;         
    000012 *};                       
    000013 *#if 0!=0                 
    000014 .end                      
    000015  MEND                     
    000016 *#endif                   
    ****** **************************
and include it in my Metal C program:
    EDIT       SSAF.METALC.C(CKLTHING) - 01.00
    Command ===>                              
    000205 #include"ckkprolg.h"               
    000206                                    
    000207 #pragma margins(2,72)              
    000208  #include"ckktest.h"               
    000209  #pragma nomargins                   
I get a bunch of error messages:
      205       |#include"ckkprolg.h"               /* Include assembler macros needed                        
      206       |                                      for Metal C prolog and epilog  */                      
      207       |#pragma margins(2,72)                                                                        
      207       +                                                                                             
      208       |#include"ckktest.h"                                                                          
    *=ERROR===========>     CCN3275 Unexpected text 'struct' encountered.                                     
    *=ERROR===========>     CCN3166 Definition of function Test requires parentheses.                         
    *=ERROR===========>     CCN3275 Unexpected text 'void' encountered.                                       
    5650ZOS V2.1.1 z/OS XL C                          'SSAF.METALC.C(CKLTHING)'                    10/04/2019 
                                              * * * * *   S O U R C E   * * * * *                             
     LINE  STMT                                                                                               
                 *...+....1....+....2....+....3....+....4....+....5....+....6....+....7....+....8....+....9...
    *=ERROR===========>     CCN3045 Undeclared identifier Test1.                                              
    *=ERROR===========>     CCN3275 Unexpected text 'int' encountered.                                        
    *=ERROR===========>     CCN3045 Undeclared identifier TestInt.                                            
    *=ERROR===========>     CCN3275 Unexpected text 'char' encountered.                                       
    *=ERROR===========>     CCN3045 Undeclared identifier TestChar.                                           
    *=ERROR===========>     CCN3046 Syntax error.                                                             
    *=ERROR===========>     CCN3273 Missing type in declaration of theESTAEXStatic.                           
      209       |#pragma nomargins                                                                            
    回答1:
The include file is missing #pragma margins. Since it is a file level directive, it needs to be present in each source file. Please see IBM Knowledge Center, which says, "The setting specified by the #pragma margins directive applies only to the source file or include file in which it is found. It has no effect on other include files."
来源:https://stackoverflow.com/questions/58244043/how-do-i-go-about-making-this-work-with-a-include-it-works-fine-when-dropped-s