On 5/09/2014 4:56 PM, Martin Packer wrote:
So tell me, if one wanted to achieve this apparently non-standard effect
how WOULD one go about it?

Write your own preprocessor!

Not that I want to but it HAD to be asked. :-)

Thanks, Martin

Martin Packer,
zChampion, Principal Systems Investigator,
Worldwide Banking Center of Excellence, IBM

+44-7802-245-584

email: [email protected]

Twitter / Facebook IDs: MartinPacker
Blog:
https://www.ibm.com/developerworks/mydeveloperworks/blogs/MartinPacker



From:   David Price <[email protected]>
To:     [email protected]
Date:   05/09/2014 09:54
Subject:        Re: IBM C compiler substituting for macros inside
literals?
Sent by:        IBM Mainframe Discussion List <[email protected]>



Hi Glen!

For the benefit of others, K&R = "The C Programming Language" by Kernighan
& Ritchie.
Appendix A   C REFERENCE MANUAL,  section 12.1  Token Replacement
is on page 207 in the original 1978 edition.

Section 12.1 explicitly deals with both   #define identifier token-string
and
#define identifier( identifier , ... , identifier ) token-string
[that is, simple #define constants and the almost-as-simple macro
functions].

It says "Text inside a string or a character constant is not subject to
replacement".

This 1978 K&R is prior to the November 15, 1978 extensions to C regarding
Structure Assignment and Enumeration types.
(I say this just to establish that the above indeed relates to the
earliest widely-circulated definition of C.)

The K&R book's Appendix A "C Reference Manual" was often reprinted as part
of the AT&T UNIX manuals.

I wonder if those few early C Macro Preprocessors that broke this rule did
so knowingly (as a feature to get inside a string before this was provided
for) or unknowingly (simplistic coding).  I could forgive this for
something like the early Portable C Compiler where the focus was on
providing a simple C compiler that could compile a more sophisticated one.
  Then again, the C Macro Preprocessor was a separate program in those
days, so the Portable C Compiler could just as easily have used a copy of
a production C Preprocessor, so its logic should have been correct.  (I'm
not saying the Portable C Compiler had the bug - just wildly speculating
as to where the coding error may have come from.)

-- dap



On Thu, 4 Sep 2014 02:36:51 -0700, glen herrmannsfeldt
<[email protected]> wrote:

it must be bug with the macro preprocessor used by USS's cc comand.
Even K&R's 1978 definition of C makes it clear that arguments
inside "..." strings are not to be substituted.
Two different questions.

If you:

#define d 5
printf("%d", 3);

the d won't be replaced. That is, in preprocessor terms, a very
different question from:

#define S(d) printf("%d", d)

The person writing a macro with arguments has full control over
the names, and can choose them to match or not. This allows for:

#define debug(x) printf("x=%d\n", x)

ANSI added the stringizing operation, and then removed the
replacement inside strings.

While not explicitly stated in K&R1, it is the normal case
for non-ANSI preprocessors.

-- glen
----------------------------------------------------------------------
For IBM-MAIN subscribe / signoff / archive access instructions,
send email to [email protected] with the message: INFO IBM-MAIN



Unless stated otherwise above:
IBM United Kingdom Limited - Registered in England and Wales with number
741598.
Registered office: PO Box 41, North Harbour, Portsmouth, Hampshire PO6 3AU

----------------------------------------------------------------------
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

Reply via email to