Указатель функции С++ как параметр в Doxygen

У меня возникла ситуация, когда мне нужно задокументировать подпись bsearch() в Doxygen. Эта подпись выглядит так:

void * __cdecl bsearch (
    const void *key,
    const void *base,
    size_t num,
    size_t width,
    int(__cdecl *compare)(const void *, const void *)
    )

Проблема, с которой я столкнулся, заключается в том, как составить команду @param для указателя *compare, так как Doxygen жалуется, что «аргумент 'compare' команды @param не найден в списке аргументов bsearch» во всем, что я бросить на это.

Это автономная реализация, поэтому она не зависит от подписи библиотеки, однако я думаю, что если бы я это сделал:

typedef int(__cdecl *pcompare)(const void *, const void *);

изменив подпись на pcompare, у вызывающих абонентов, использующих стандартную подпись, возникнут проблемы с типом.

Я открыт для ЛЮБОГО решения, которое позволит мне задокументировать это без тревоги со стороны Doxygen.


person Mike Morris - MBXSW    schedule 10.05.2015    source источник
comment
Использование кода bsearch is C++ является потерей для всех учетных записей — он не является типобезопасным и медленнее, чем эквивалентные шаблонные функции C++, такие как std::binary_search и std::lower_bound.   -  person Ben Voigt    schedule 10.05.2015
comment
Спасибо, Бен. Дело в том, что рассматриваемый проект представляет собой модернизацию и настройку Libctiny, а точнее minicrt, поэтому есть некоторые ограничения. Для собственного использования я урежу эту вещь даже больше, чем она есть, поскольку моя цель состоит в том, чтобы отвлечь пуристов от моей спины по поводу моего последнего раунда утилит, выходящих в .NET, сохраняя при этом очень маленький exe.   -  person Mike Morris - MBXSW    schedule 10.05.2015


Ответы (2)


однако я думаю, если бы я сделал:

typedef int(__cdecl *pcompare)(const void *, const void *);

изменив подпись на pcompare compare, у вызывающих абонентов, использующих стандартную подпись, возникнут проблемы с типом.

Вы должны были попробовать это, прежде чем сдаться. typedef не определяет новый тип, он просто создает новый идентификатор для сложного типа. Полученные подписи идентичны.

Однако будьте осторожны, потому что ни одна из показанных форм не является правильной подписью. Чтобы объявить функцию библиотеки времени выполнения C, такую ​​​​как bsearch, вам нужно extern "C". (и то же самое будет с указателем на функцию typedef - языковая связь является частью типа функции)

При этом достаточно просто установить __cdecl в качестве предопределенного макроса в вашей конфигурации doxygen, чтобы позволить ему анализировать все эти варианты, включая те, которые содержат сложный набор токенов, определяющих тип параметра.

person Ben Voigt    schedule 10.05.2015
comment
На самом деле я не пробовал, потому что мне это действительно не нужно. Документирование среды выполнения было потрясающим обучающим опытом. Спасибо за подтверждение того, что я думал, что прочитал. Мне все еще нужно обдумать extern "C", который находится над `bsearch` в файле, но typedef определенно лучше справляется с тем, чтобы не сдувать макет сига Doxygen. - person Mike Morris - MBXSW; 10.05.2015

С typedef проблем нет.
Вы должны использовать его в любом случае --- так понятнее читать.

person smiling_nameless    schedule 10.05.2015