微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

__inline__ 和 __attribute__ 混淆了 Doxygen

如何解决__inline__ 和 __attribute__ 混淆了 Doxygen

解决解决方法见文末)

我在一个嵌入式 C 项目中并编写了一个仅包含静态强制内联函数的 .h 文件。我已经像这样记录了它们:

//----------------------------------------------------------------------------
// RECT WIDTH
/** Returns a source rectangle's width.
 *  The RECT_Width method calculates and returns a source rectangle's width.
 * 
 * @param r  A RECT structure that contains the specified source rectangle.
 * @return   The source rectangle's width.
 */
FORCE_INLINE __attribute__((unused))
static COORD RECT_Width(RECT r) {
    return r.Right-r.Left;
}

FORCE_INLINE 定义为

#define FORCE_INLINE  __attribute__((always_inline))

问题行将展开为:

__attribute__((always_inline)) __attribute__((unused))

__attribute__添加EXCLUDE_SYSMBOLS 部分,因此它们不会被记录为函数

问题是 Doxygen 似乎对 FORCE_INLINE __attribute__((unused)) 行感到困惑。它似乎不同步并跳过文件间的几乎所有功能,除了一个功能。该函数的格式与其他函数完全相同。

Doxygen 还将部分函数的参数和代码片段记录为全局变量

FORCE_INLINE RECT   r2
r   Left = MAX(r1.Left,r2.Left)
r   Top = MAX(r1.Top,r2.Top)
r   Right = MIN(r1.Right,r2.Right)
r   Bottom = MIN(r1.Bottom,r2.Bottom)
return  r
FORCE_INLINE POINT  p
FORCE_INLINE COORD  offset
FORCE_INLINE POINT  pos

我还尝试打开 MACRO_EXPANSIONEXPAND_ONLY_PREDEF 并将 FORCE_INLINE 添加EXPAND_AS_DEFINED 部分。没有区别。

我也尝试将它们添加EXCLUDE_SYSMBOLS

FORCE_INLINE
__attribute__

作为测试,我将 @fn 命令添加到 Doxygen 未看到的函数之一,并生成了该函数的所有文档。但我无法将 @fn 添加到每个函数,并且将代码片段记录为全局变量

有没有人知道如何让 Doxygen 忽略每个函数前面的 FORCE_INLINE __attribute__((unused))

解决方
@KamilCuk 给了我一个想法,所以我将它添加到我的头文件中:

#if __DOXYGEN__
    #define FORCE_INLINE_SILENT
#else
    #define FORCE_INLINE_SILENT FORCE_INLINE __attribute__((unused))
#endif

然后将 FORCE_INLINE __attribute__((unused)) 替换为 FORCE_INLINE_SILENTFORCE_INLINE 在另一个文件中定义。

解决方法

问题是 Doxygen 似乎对 FORCE_INLINE attribute((unused))

行感到困惑

你应该处理它,以免混淆。例如:

#if __GNUC__
#define FORCE_INLINE  __attribute__((always_inline))
#else
// expands to nothing for others
#define FORCE_INLINE
#endif

或喜欢:

#if __DOXYGEN__
#define FORCE_INLINE
#endif

那样,doxygen 将什么也看不到。您还需要以这种方式处理 __attribute__((unused)),并且通常将此类宏放在一个公共标头中,以提供您的项目与不同编译器的兼容性。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。