Compiling a C program with g++ 4.3.1 yields an error about std::FILE

Marc Glisse marc.glisse at normalesup.org
Fri Jul 25 14:37:18 CEST 2008


On Thu, 24 Jul 2008, Torbjorn Granlund wrote:

>  The name freefunc_t is just an exemple, it would probably be better if it
>  was prefixed by gmp_ or something like that. The typedef could also be
>  moved to gmp.h as it seems like a useful addition to anyone who wants to
>  use mp_get_memory_functions, whether in C or C++, and in there it would
>  naturally fall inside a extern "C" when compiled in C++.
>
> I'll leave it in gmpxx.h for this dot-release.
>
> Why have the freefunc_t globally in gmpxx.h, why not put it into the
> function, to avoid namespace pollution?

That indeed would be nice, but it is forbidden to have linkage 
specifications inside anything. (It was the first thing I tried :-)

> A related isue with gmpxx.h: We use many short, non-prefixed variable names like
> "s", and "f" and "z" in gmpxx.h.  If a user decides to say
>
>   #define s )
>
> before includng gmpxx.h, I think gmpxx.h will not work too well.  In
> C, one typically uses prefixes to avoid this.  Shouldn't this be done
> for gmpxx.h also?

I know libstdc++ uglifies all variable names, but only compiler 
implementors have this luxury (using __gmp* in gmp is already forbidden 
and generates warnings with some compilers).

I think mostly in C++ you can consider it the user's fault if they #define 
short variables, although we recently had problems with solaris defining 
plenty of macros with just two capital letters.

If noone complains, I wouldn't worry about this.


> It turns out that gcc 2.95 has problems with the new code.  Yes, some
> of my test machines still use that old compiler.  :-)

I actually still have 2.72, 2.95, 3.3, 3.4, 4.0, 4.1, 4.2 and 4.3 on an 
other machine for test purposes so I can verify this.

> The error is:
>
>  gmpxx.h:1349: multiple storage classes in declaration of `__gmp_freefunc_t'
>
> At line 1349, we have this new line:
>
>  extern "C" typedef void (*__gmp_freefunc_t) (void *, size_t);
>
> I'd like to make the code work with 2.95, if possible.
>
> What would a correct alternatve form for older c++ compilers be?  Just
> dropping the 'extern "C"' seems to help with this particular gcc
> release.

The whole point of using a typedef is so we can have the extern "C"...

modifying it to:
extern "C" {
   typedef ...;
}

seems to help at compile time, but then the linker gives funny messages.

/usr/bin/ld: error in t-misc.o(.eh_frame); no .eh_frame_hdr table will be 
created.

However, I think I already have this without the patch, so g++-2.95 might 
simply not work anymore on this system. Can you try the version with { and 
} on your system?

-- 
Marc Glisse


More information about the gmp-bugs mailing list