Got it The # operator The # (single number sign) operator converts a parameter of a function-like macro into a character string literal. For example, if macro ABC is defined using the following directive: #define ABC(x) #x
-----Original Message----- From: IBM Mainframe Discussion List <[email protected]> On Behalf Of Seymour J Metz Sent: Friday, January 17, 2020 1:36 PM To: [email protected] Subject: Re: Metal C using Z/OS macros in C macros z/OS Version 2 Release 4 XL C/C++ Language Reference, SC14-7308-40 https colon //www-01.ibm.com/servers/resourcelink/svc00100.nsf/pages/zOSV2R4sc147308/$file/cbclx01_v2r4.pdf Chapter 17. Preprocessor directives P. 405 -- Shmuel (Seymour J.) Metz http://mason.gmu.edu/~smetz3 ________________________________________ From: IBM Mainframe Discussion List <[email protected]> on behalf of Joseph Reichman <[email protected]> Sent: Friday, January 17, 2020 1:18 PM To: [email protected] Subject: Re: Metal C using Z/OS macros in C macros The only issue I have looking in the documentation in the metal C reference or The XL\C language reference which has some documentation on __asm No where is thre a thing about # and text substitution > On Jan 17, 2020, at 12:48 PM, Charles Mills <[email protected]> wrote: > > I am not an expert at all on C __asm and only barely something of an > expert on C macros so I avoided wading into this one. I will say > > 1. What @Peter Farley says sounds right to me. > > 2. Keep in mind that a macro definition in C does not "do anything" > (so to speak -- of course it does something). It just sets up future > text substitution. So at the time you define your macro no C variables > need exist. There are no preexisting conditions for a macro > definition. Your macro must be a syntactically valid macro, that's > all. Macro definition knows nothing about variable declarations -- you > are just setting up some rules for text substitution. > > Then when you invoke your macro, the C preprocessor will do its text > substitution magic. It will use your macro definition and your macro > invocation to create some alleged C code. Somewhat later, the C > compiler will attempt to compile that alleged C code. So if that C > code references a variable, then yes, that variable will have to have > been previously (earlier in the source code file) declared. Earlier as > in before the invocation of the macro, not necessarily before the definition > of the macro. > > Charles > > > -----Original Message----- > From: IBM Mainframe Discussion List [mailto:[email protected]] > On Behalf Of Farley, Peter x23353 > Sent: Friday, January 17, 2020 8:31 AM > To: [email protected] > Subject: Re: Metal C using Z/OS macros in C macros > > The %0 and %1 are parameters to the __asm function, it will do the > substitution of the 2nd and 3rd parameter in the __asm(...) invocation > into the %0 and %1 spots in the 1st parameter. > > And I concur with your description - the *invocation* of the "SETUP(...)" > macro will specify the variables to be used and *those* variables are > the ones that need to be defined, "xx" and "yy" in your example. > > If the OP (Mr. Reichman) codes the *invocation* of the SETUP macro as > follows: > > SETUP(supstate,key) > > Then both "supstate" and "key" must be defined C variables. > > The __asm function does not *define* variables, it just *uses* them. > The variables mentioned in an __asm invocation must already be defined > in the C code. > > Peter > > -----Original Message----- > From: IBM Mainframe Discussion List <[email protected]> On > Behalf Of retired mainframer > Sent: Friday, January 17, 2020 11:06 AM > To: [email protected] > Subject: Re: Metal C using Z/OS macros in C macros > > In you C code, when you "invoke" the macro, you would provide the > values of the two macro parameters. Something like > SETSUP(xx,yy) > It is the xx and yy that would show up inside the two parenthetical > expressions in the generated code. Keep in mind that a C macro > performs simple text substitution long before the actual compilation starts. > > Based on the generated code you show, you would not terminate the > above invocation with a semicolon. > > I've never used __asm but is > __asm ( " MODESET KEY=%0,MODE=%1 \n" : "=s"(xx), "=s"(yy) ) what you > want the compiler to see? > > Are you using %0 and %1 to mean the macro parameters? That is not the > way C macros work. > > It looks like there should be a line continuation back slash following > the left brace. I don't think you want the one that follows the right > brace since there is no following line. > >> -----Original Message----- >> From: IBM Mainframe Discussion List <[email protected]> On >> Behalf Of Joseph Reichman >> Sent: Friday, January 17, 2020 5:22 AM >> To: [email protected] >> Subject: Metal C using Z/OS macros in C macros >> >> Just wondering if I can do something like this >> >> #define SETSUP(supstate,key) \ >> { >> __asm ( " MODESET KEY=%0,MODE=%1 \n" : "=s"(supstate), "=s"(key) ) \ >> } \ >> >> Seems like the variables have to be defined > > ---------------------------------------------------------------------- > > This message and any attachments are intended only for the use of the > addressee and may contain information that is privileged and confidential. > If the reader of the message is not the intended recipient or an > authorized representative of the intended recipient, you are hereby > notified that any dissemination of this communication is strictly > prohibited. If you have received this communication in error, please > notify us immediately by e-mail and delete the message and any attachments > from your system. > > ---------------------------------------------------------------------- > For IBM-MAIN subscribe / signoff / archive access instructions, send > email to [email protected] with the message: INFO IBM-MAIN > > ---------------------------------------------------------------------- > For IBM-MAIN subscribe / signoff / archive access instructions, send > email to [email protected] with the message: INFO IBM-MAIN ---------------------------------------------------------------------- For IBM-MAIN subscribe / signoff / archive access instructions, send email to [email protected] with the message: INFO IBM-MAIN ---------------------------------------------------------------------- For IBM-MAIN subscribe / signoff / archive access instructions, send email to [email protected] with the message: INFO IBM-MAIN ---------------------------------------------------------------------- For IBM-MAIN subscribe / signoff / archive access instructions, send email to [email protected] with the message: INFO IBM-MAIN
