为什么在extern“ C”中定义__cplusplus

use*_*085 3 c c++ mpi

在extern内"C" { },__cplusplus仍然定义了宏。当我想包括C版mpi.h在我的图书馆的头部被动态加载,这将无法正常工作,mpi.h还发现__cplusplus并仍将加载就像是用C ++开。

#undef __cplusplus与gcc一起使用。但是我不想依靠这一点。

那么,如何编写一个使用mpi的C ++版本和-链接到使用mpi的C版本的C库的C ++程序(在#include <mpi.h>标头中已经出现了?

示例代码:

library.h:

#ifdef __cplusplus
extern "C" {
#endif

#include <mpi.h>

void library_do(MPI_Comm comm);

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

program.cpp:

#include <library.h>

#include <mpi.h>

int main() {
  MPI::Init();
  // do some mpi C++ calls...  
  library_do(MPI::COMM_WORLD);
  MPI::Finalize();
}
Run Code Online (Sandbox Code Playgroud)

如果有人想在此处播放示例library.c:

#include <stdio.h>
#include "library.h"

void library_do(MPI_Comm comm)
{
    int rank;
    MPI_Comm_rank(comm, &rank);
    printf("MPI Rank: %d", rank);
}
Run Code Online (Sandbox Code Playgroud)

并编译我尝试的所有内容

#ifdef __cplusplus
extern "C" {
#endif

#include <mpi.h>

void library_do(MPI_Comm comm);

#ifdef __cplusplus
}
#endif
Run Code Online (Sandbox Code Playgroud)

Som*_*ken 6

__cplusplus如果编译器是C ++编译器,它将始终由编译器定义。extern "C" {}只为您提供C链接,因此其中的代码可与C编译器很好地配合。