This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Re: G++ preprocessor problem with unary ## -- summary


Summary of the problem: a particular header file in the LEDA software
package uses "##" in an unusual way.  There is a #defined macro that
expands to a variable-length list of comma-separated words, and this is
then passed down through two more levels of macro calls *as a single
argument* by using "##" in front of the parameter whose value is the list.

The "##" prevents the list from being rescanned and thus turned into
multiple arguments.  But, as Zack Weinberg pointed out, this use of "##"
without actually pasting tokens is not a properly-defined behaviour of
the C preprocessor, and in fact the result is explicitly undefined.

Older versions of gcc, plus many of the other c++ compilers LEDA is used
with, apparently do provide the desired behaviour of "##".  But the "gcc
2.96" supplied with Red Hat 7 flags this use with a warning and ignores it.
This behaviour is apparently the way gcc 3.0 is expected to work as well.

I eventually just rewrote the header file so that the macro expansion
that produces the list is done at the lowest level, eliminating the need
for the "unary ##" entirely.

After doing this, I noticed that the LEDA authors must have known about
the problem already, because the header file which #includes the troublesome
file has a special check for DECCXX.  If that symbol is defined, the outer
header file includes a pre-expanded version of the troublesome file rather
than the "normal" one.  This says to me that they *knew* the code didn't
work properly on at least one compiler, but rather than fixing it at the
source level they built an ugly workaround instead.

	Dave



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]