GMP, C++ and extern "C"

Niels Möller nisse at
Mon Nov 20 19:13:41 CET 2006

Jeronimo Pellegrini <pellegrini at> writes:

> The file in question was Nettle's rsa.h, which includes gmp.h.
> The problem is that I'd already do:
> extern "C" {
> #include <nettle/rsa.h>
> }
> But then when rsa.h included gmp.h it broke:
> /usr/include/gmp.h:2129: error: declaration of C function 'std::ostream& operator<<(std::ostream&, const __mpq_struct*)' conflicts with
> /usr/include/gmp.h:2128: error: previous declaration 'std::ostream& operator<<(std::ostream&, const __mpz_struct*)' here
> (more errors)

I think Emmanuel's point is that if nettle/rsa.h contained it's own
C++ guards, then it could do the right thing:


  /* Note: C++ linkage when included in a C++ program */
  #include <gmp.h>

  #ifdef __cplusplus
  extern "C" {

  /* Plain C linkage */
  void rsa_foo(...);

You would have to remove the extern C from your C++ source files that
uses Nettle, which is inconvenient, but then it would just work.

I've more or less decided that this is the best way to solve the


More information about the gmp-bugs mailing list