Open MPI logo

Open MPI User's Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Open MPI User's mailing list

Subject: Re: [OMPI users] Can't compile C++ program with extern "C" { #include mpi.h }
From: Brian Barrett (brbarret_at_[hidden])
Date: 2008-01-01 13:07:54


On Jan 1, 2008, at 12:47 AM, Adam C Powell IV wrote:

> On Mon, 2007-12-31 at 20:01 -0700, Brian Barrett wrote:
>>
>>
>> Yeah, this is a complicated example, mostly because HDF5 should
>> really be covering this problem for you. I think your only option at
>> that point would be to use the #define to not include the C++ code.
>>
>> The problem is that the MPI standard *requires* mpi.h to include both
>> the C and C++ interface declarations if you're using C++. There's no
>> way for the preprocessor to determine whether there's a currently
>> active extern "C" block, so there's really not much we can do. Best
>> hope would be to get the HDF5 guys to properly protect their code
>> from C++...
>
> Okay. So in HDF5, since they call MPI from C, they're just using
> the C
> interface, right? So should they define OMPI_SKIP_MPICXX just in case
> they're #included by C++ and using OpenMPI, or is there a more MPI
> implementation-agnostic way to do it?

No, they should definitely not be disabling the C++bindings inside
HDF5 -- that would be a situation worse than the current one.
Consider the case where an application uses both HDF5 and the C++ MPI
bindings. It includes hdf5.h before mpi.h. The hdf5.h includes
mpi.h, without the C++ bindings. The application then includes mpi.h,
wanting the C++ bindings. But the multiple inclusion protection in
mpi.h means nothing happens, so no C++ bindings.

My comment about HDF5 was that it would be easiest if it protected its
declarations with extern "C" when using C++. This is what most
packages that might be used with C++ do, and it works pretty well.
I'd actually be surprised if modern versions of HDF5 didn't already do
that.

Now that it's not New Years eve, I thought of what's probably the
easiest solution for you. Just include mpi.h (outside your extern "C"
block) before hdf5.h. The multiple inclusion protection in mpi.h will
mean that the preprocessor removes everything from the mpi.h that's
included from hdf5.h. So the extern "C" around the hdf5.h shouldn't
be too much of a problem.

Hope this helps,

Brian

-- 
   Brian Barrett
   Open MPI developer
   http://www.open-mpi.org/