自动检测是否需要在函数参数中添加“ const”限定符

时间:2018-10-17 04:30:38

标签: c compilation mpi c-preprocessor

我已经编写了一个PMPI分析库,该库拦截了许多MPI函数。 在我的本地计算机上,我安装了OpenMPI,并且某些函数参数具有const限定符,例如:

int PMPI_Gather(const void *sendbuf, int sendcount, ...)  

因此,自然地,我的PMPI库在相应的挂钩函数中也具有那些const限定符。但是,经常运行东西的远程计算机安装了MPI,其中mpi.h中的函数参数没有const限定符,因此,当我编译库时,会收到一堆警告,提示函数声明不兼容。当然,我可以忽略警告,取消警告或手动删除const限定符。

我想知道是否有一种更优雅的方式来处理这种情况,是否有可能以某种方式检测mpi.h中的函数声明是否具有const参数,并自动在性能分析库代码中添加或删除const限定符在编译过程中,或者可能是某种配置功能。<​​/ p>

3 个答案:

答案 0 :(得分:2)

MPI 3.0中添加了C绑定的

const-正确性,即const参数的IN指针。您可以通过以下方式处理此问题:

#if MPI_VERSION >= 3
    #define MPI_CONST const
#else
    #define MPI_CONST
#endif

int PMPI_Gather(MPI_CONST void *sendbuf, int sendcount, ...)

注意:您可以在"diff to 3.0" version of the standard A.2 C绑定部分中轻松查看更改。

答案 1 :(得分:1)

#ifdef ...的替代方法是简单地检查函数获得的类型:

typedef int PMPI_Gather_noconst (void *sendbuf, int sendcount, ...);
typedef int PMPI_Gather_const (const void *sendbuf, int sendcount, ...);

if( _Generic(PMPI_Gather, PMPI_Gather_noconst*:true, PMPI_Gather_const*:false) )
{
  PMPI_Gather_noconst* stuff;
  ...
}
else
{
  PMPI_Gather_const* stuff;
  ...
}

答案 2 :(得分:0)

通常在这种情况下,可以使用#ifdef#ifndef在多个位置定义变量或定义。 您会看到类似

#ifndef _YOU_CONSTANT #define _YOU_CONSTANT #endif