http://gcc.gnu.org/bugzilla/show_bug.cgi?id=2316
--- Comment #26 from Jonathan Wakely <redi at gcc dot gnu.org> 2011-08-30
12:17:47 UTC ---
(In reply to comment #25)
> (In reply to comment #23)
>
> > We could solve it with an alternative syntax for language linkage
> > using attributes:
> >
> > void f( [[extern(C)]] void (*p)() );
>
> Is that where attributes go? That must be inconvenient for functions returning
> function pointers. Or does it have some kind of "scope"?
I probably have the syntax wrong, I wanted that attribute to apply to the
parameter p, but for a function poiner maybe it should be:
void f( void (*p)() [[extern(C)]] );
And for a function pointer return type my attempt would be
void (* ugly(int)[[extern(C++)]] )() [[extern(C)]] ;
i.e.
extern "C" { typedef void (*c_func)() }
extern "C++" { c_func ugly(int); }
Maybe.
> My guess is that we are supposed to use extern "C" functions very rarely and
> only in very specific contexts where it doesn't matter so much if you can't do
> all the meta-programming stuff.
I did suggest to the POSIX C++ WG that there should be extern "C++" overloads
of pthread_create, pthread_atfork etc. just as we have overloads of qsort and
bsearch taking pointers to extern "C++" functions, which would allow existing
code that relies on this bug to just work without changes. I was going to
submit a proposal along those lines, but that WG seemed to fizzle out and I
never finished the paper. I probably still have it on an old hard drive on a
shelf somewhere.