Автоматически определять, нужно ли добавлять «const» квалификатор в параметры функции - PullRequest
0 голосов
/ 17 октября 2018

Я написал библиотеку профилирования PMPI, которая перехватывает многие функции MPI.На моем локальном компьютере я установил OpenMPI, а некоторые параметры функций имеют спецификатор const, например:

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

Поэтому, естественно, моя библиотека PMPI также имеет эти квалификаторы const в соответствующих функциях ловушек.Тем не менее, на удаленной машине, где я часто работаю, есть установка MPI, в которой параметры функций в mpi.h не имеют квалификаторов const, поэтому при компиляции библиотеки я получаю целую кучу предупреждений о том, что объявление функции несовместимо,Конечно, я могу просто игнорировать предупреждения, подавлять их или вручную удалять квалификатор const.

Интересно, есть ли более изящный способ справиться с ситуацией, можно ли как-то определить, имеют ли объявления функций в mpi.h параметры const или нет, и автоматически добавить или удалить квалификатор const впрофилирование кода библиотеки во время компиляции или, возможно, это может быть какая-то особенность конфигурации.

Ответы [ 3 ]

0 голосов
/ 17 октября 2018

const -корректность для привязок C, то есть const указатели для параметров IN, была добавлена ​​в MPI 3.0.Вы можете справиться с этим следующим образом:

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

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

Примечание: изменения можно легко увидеть в разделе Привязки A.2 C версии "diff to 3.0"стандарт .

0 голосов
/ 17 октября 2018

Альтернативой #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;
  ...
}
0 голосов
/ 17 октября 2018

Обычно в таких ситуациях, когда переменная или определения могут быть определены в нескольких местах, используется #ifdef или #ifndef.Вы бы хотели что-то вроде:

#ifndef _YOU_CONSTANT #define _YOU_CONSTANT #endif

...