vinoski@apollo.HP.COM (Stephen Vinoski) (05/15/91)
In article <28302040.69ED@deneva.sdd.trw.com> knurlin@spf.trw.com (Scott Karlin) writes: >I am looking for a clarification on the ANSI-C token merging >operator (##). According to H&S: "After *all* [emphasis mine] >macro replacements have been done, the two tokens surrounding >any ## operator are combined into a single token." I interpret >this to mean that: > >#define INDEX 0 >#define FN_NAME(x) name ## x >void FN_NAME(INDEX) () { printf("Hello\n"); } (I have cross-posted this to comp.std.c since a similar question recently came up there. Follow-ups have been directed to comp.lang.c.) I had a problem with token pasting similar to yours. A compiler writer said that the problem was caused by the fact that I was attempting to paste arbitrary text with macro parameters; he said that token pasting is only meant to work on macro parameters. The ANSI C standard appears to agree with him; I believe it is section 3.8.3.3 (I don't have the standard handy) that says that ## causes macro parameters to be pasted together. If I have misinterpreted the standard, I'm sure I will hear about it. :-) I have also noticed that K&R II only shows macro parameters being pasted together. What if you change your example to: #define INDEX 0 #define REAL_FN_NAME(x,y) x ## y #define FN_NAME(x) REAL_FN_NAME(name,x) Then your example usage: >void FN_NAME(INDEX) () { printf("Hello\n"); } should produce the desired result. -steve | Steve Vinoski (508)256-0176 x5904 | Internet: vinoski@apollo.hp.com | | HP Apollo Division, Chelmsford, MA 01824 | UUCP: ...!apollo!vinoski |
vinoski@apollo.HP.COM (Stephen Vinoski) (05/16/91)
In article <519416cd.20b6d@apollo.HP.COM> vinoski@apollo.HP.COM (Stephen Vinoski) writes: >In article <28302040.69ED@deneva.sdd.trw.com> knurlin@spf.trw.com (Scott Karlin) writes: >>I am looking for a clarification on the ANSI-C token merging >>operator (##). According to H&S: "After *all* [emphasis mine] >>macro replacements have been done, the two tokens surrounding >>any ## operator are combined into a single token." I interpret >>this to mean that: >> >>#define INDEX 0 >>#define FN_NAME(x) name ## x >>void FN_NAME(INDEX) () { printf("Hello\n"); } > >I had a problem with token pasting similar to yours. A compiler >writer said that the problem was caused by the fact that I was >attempting to paste arbitrary text with macro parameters; he said that >token pasting is only meant to work on macro parameters. > >The ANSI C standard appears to agree with him; I believe it is section >3.8.3.3 (I don't have the standard handy) that says that ## causes >macro parameters to be pasted together. If I have misinterpreted the >standard, I'm sure I will hear about it. :-) Well, what do you know - I *did* misinterpret the standard. Sigh. Section 3.8.3.3 states that preprocessor tokens can be pasted together. The problem knurlin@spf.trw.com has is caused by the fact that token pasting occurs before the result is rescanned for further macro replacement. Thanks to steven@pacific.csl.uiuc.edu (Steven Parkes) for setting me straight on this one. I hereby promise not to quote the standard from memory again. -steve | Steve Vinoski (508)256-0176 x5904 | Internet: vinoski@apollo.hp.com | | HP Apollo Division, Chelmsford, MA 01824 | UUCP: ...!apollo!vinoski |