Xref: utzoo comp.lang.c:39292 comp.std.c:4835 Path: utzoo!utgpu!news-server.csri.toronto.edu!cs.utexas.edu!swrinde!zaphod.mps.ohio-state.edu!think.com!mintaka!mit-eddie!apollo!vinoski From: vinoski@apollo.HP.COM (Stephen Vinoski) Newsgroups: comp.lang.c,comp.std.c Subject: Re: Question on ANSI ## pre-processor operator. Message-ID: <519416cd.20b6d@apollo.HP.COM> Date: 15 May 91 14:46:00 GMT References: <28302040.69ED@deneva.sdd.trw.com> Sender: root@apollo.HP.COM Reply-To: vinoski@apollo.HP.COM (Stephen Vinoski) Followup-To: comp.lang.c Organization: Hewlett-Packard Apollo Division - Chelmsford, MA Lines: 45 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 |