C++函数指针作为Doxygen中的参数

3

我有一个需要在Doxygen中记录bsearch()签名的情况。该签名如下:

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

我遇到的问题是如何为指针*compare组合@param命令,因为Doxygen抱怨“在bsearch的参数列表中找不到@ param命令的参数'compare'”,无论我尝试什么东西。

这是一个独立的实现,因此它不依赖于库签名,但是我在考虑如果我做了:

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

将签名更改为pcompare,这样使用标准签名的调用方将会出现类型问题。

我愿意接受任何允许我在不引起Doxygen警报的情况下记录此内容的解决方案。


在C++代码中使用bsearch是一种全面的损失--它不是类型安全的,而且比等效的C++模板函数如std::binary_searchstd::lower_bound更慢。 - Ben Voigt
谢谢Ben。事实是,手头的项目是对Libctiny(实际上是minicrt)进行现代化和定制,因此存在一些限制。为了自己的使用,我将把它削减得比现在更小,因为我的目的是让纯粹主义者不再对我最后一轮的.NET工具产生反感,同时保持exe文件非常小。 - Mike Morris - MBXSW
2个回答

5

however I am thinking if I did:

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

changing the signature to pcompare compare that callers using the standard signature would have a type problem.

你应该在放弃之前尝试过。 typedef 并不定义新类型,它只为复杂类型创建新标识符。 结果签名是相同的。

但要小心,因为所示的两种形式都不是正确的签名。 要声明像bsearch这样的C运行时库函数,需要extern "C"。(函数指针typedef也是如此-语言链接是函数类型的一部分)

尽管如此,仅仅将__cdecl设置为您的doxygen配置中的预定义宏可能就足以允许其解析所有这些变体,包括具有指定参数类型的复杂令牌集的变体。


我实际上并没有尝试它,因为我真的没有用它的地方。记录运行时是一次很棒的学习经历。感谢您确认我所读的内容。我仍然需要理解文件中bsearch上面的extern "C",但是typedef确实更好地避免了Doxygen sig布局的崩溃。 - Mike Morris - MBXSW

1

typedef 没有问题。
无论如何都应该使用它---这样阅读起来更清晰。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接