__inline__ 和 __attribute__ 混淆 Doxygen

问题描述 投票:0回答:2

已解决,解决方案见文末)

我正在进行一个嵌入式 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_EXPANSION
EXPAND_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_SILENT
FORCE_INLINE
在另一个头文件中定义。

c header-files doxygen-wizard xc16
2个回答
4
投票

问题是 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))
,并且通常将此类宏放在公共标头中,以提供项目与不同编译器的兼容性。


0
投票

我在代码中遇到了类似的问题。这导致 Doxygen 报告“未声明或定义记录的符号‘struct XYZ’”。这让我想到了这个 StackOverflow 问题。

我还在 doxygen GitHub 中找到了这个“修复”(

https://github.com/doxygen/doxygen/issues/2412

): __attribute__((section))

这对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.