c++ - Couple of postings at comp.lang.C++ Re ##, food for thought
- dan <dan_member pathlink.com> Dec 03 2003
I'd think... #defina a(x) x a(the_file).ext should result in the_file.ext But then I'm not sure what the compiler should do if I write, a(the_file)ext //no dot
Rob Williscroft wrote: It should produce the output "the_fileext" (not the quotes), however this is 2 preproesor tokens (though only one C++ identifier). Add: #define the_fileext Expansion #define B() a(the_file) B() should produce: "the_fileext" Not "Expansion". I.e. juxtaposition is fine for producing C++ tokens but not for preprocessor tokens (i.e. tokens that can themselves be expanded). The pre ## way was something like: #define cat(a, b ) a/**/b #define XY Expanded cat(X, Y) produced "Expanded". This is what (IMO) ## was designed to fix.Wow! My head is spinning. Ok, you're saying that in the old days a macro could modify the instance of another macro before the latter was applied. But I thought that was the way it is currently, isn't it? Would your last example NOT do that now? And how does ## prevent... what exactly? Maybe if you could give me a 4-way example: What worked and didn't work / then and now. Thx.
Rob Williscroft wrote: The problem with this method is when the C standard came out it required comments to be replaced with a single space character. Presumably this was so you couldn't write print/* whatever */f( "\n" ); and have the compiler see printf( "\n" ); So code that relied on this behaviour needed another way of achiving the same thing hence the invention of ##. Rob.
Dec 03 2003