doxygen 将宏类型错误渲染为 public 成员函数

doxygen misrendering macro type as public member function

我正在使用类型宏 list(type),它扩展为动态类型 [list_of_type],如下所示:

主要片段

...
#define list(type) force_append_macro(list_of_,type)
...
typedef struct _improperlydocumented
{
  list(char_ptr) *words;
}improperlydocumented;
...

问题

doxygen is incorrectly rendering this type [ list(char_ptr) ] as a public member function ( instead of member data ).

环境信息

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 14.04.1 LTS
Release:    14.04
Codename:   trusty

$ doxygen --version
1.8.6

doxygen 向导生成以下输出:

doxygen -g

我的 code/config :


doxygen.config

PROJECT_NAME           = "doxytest"
OUTPUT_DIRECTORY       = ./build/docs
OPTIMIZE_OUTPUT_FOR_C  = YES

TYPEDEF_HIDES_STRUCT   = YES

HIDE_SCOPE_NAMES       = YES
SHOW_NAMESPACES        = NO
INPUT                  = ./
FILE_PATTERNS          = *.h *.c

GENERATE_HTML          = YES
GENERATE_LATEX         = NO

ENABLE_PREPROCESSING   = YES
MACRO_EXPANSION        = NO
EXPAND_ONLY_PREDEF     = YES
SEARCH_INCLUDES        = YES
INCLUDE_PATH           = 
INCLUDE_FILE_PATTERNS  = 
PREDEFINED             =
EXPAND_AS_DEFINED      = 

注意:我尝试设置 EXPAND_AS_DEFINED = list;输出与下面相同..

list.h

#ifndef __list__
#define __list__

typedef struct 
{
  int capacity,
      count,
      objsize,
      xprate;
  void *data;
}glist_t;

/* allow list types to be defined (as wrappers around generic_list) */
#define append_macro(a,b) a ## b
#define force_append_macro(a,b) append_macro(a,b)
#define declare_named_list_type(name,type) typedef union\
                                           {struct force_append_macro(_template_,name)\
                                             {\
                                               int capacity,\
                                               count,\
                                               objsize,\
                                               xprate;\
                                               type *data;\
                                             }template;\
                                             glist_t ls;\
                                           }name
#define declare_list_type(type) declare_named_list_type(force_append_macro(list_of_,type),type)
#define list(type) force_append_macro(list_of_,type)

typedef char * char_ptr;
declare_list_type(char_ptr);

/*!
 * This object is improperly documented.
 *
 * Issue is that the list(char_ptr) is treated as a member function instead of a type..
 */

typedef struct _improperlydocumented
{
  list(char_ptr) *words;
}improperlydocumented;

#endif

氧气输出

improperlydocumented Struct Reference


#include <list.h>

Public Member Functions


list (char_ptr)*words

Detailed Description


This object is improperly documented.

Issue is that the list(char_ptr) is treated as a member function instead of a type..


问题

如何将 doxygen 输出修复为文档 words 作为成员数据(不是 public 成员函数)?


配置尝试

PROJECT_NAME           = "doxytest"
OUTPUT_DIRECTORY       = ./build/docs
OPTIMIZE_OUTPUT_FOR_C  = YES

TYPEDEF_HIDES_STRUCT   = YES

HIDE_SCOPE_NAMES       = YES
SHOW_NAMESPACES        = NO
INPUT                  = ./
FILE_PATTERNS          = *.h *.c

GENERATE_HTML          = YES
GENERATE_LATEX         = NO

ENABLE_PREPROCESSING   = YES
MACRO_EXPANSION        = YES
EXPAND_ONLY_PREDEF     = YES|NO **
SEARCH_INCLUDES        = YES
INCLUDE_PATH           = 
INCLUDE_FILE_PATTERNS  = 
PREDEFINED             =
EXPAND_AS_DEFINED      = list

** 尝试了 YES 和 NO,所有其他设置都相同(不包括星号;)

PROJECT_NAME           = "doxytest"
OUTPUT_DIRECTORY       = ./
OPTIMIZE_OUTPUT_FOR_C  = YES

TYPEDEF_HIDES_STRUCT   = YES

HIDE_SCOPE_NAMES       = YES
SHOW_NAMESPACES        = NO
INPUT                  = ./
FILE_PATTERNS          = *.h *.c

GENERATE_HTML          = YES
GENERATE_LATEX         = NO

ENABLE_PREPROCESSING   = YES
MACRO_EXPANSION        = YES
EXPAND_ONLY_PREDEF     = NO
SEARCH_INCLUDES        = YES
INCLUDE_PATH           = 
INCLUDE_FILE_PATTERNS  = 
PREDEFINED             =

仍然没有正确扩展列表(char_ptr)。输出无变化

我试图通过复制+粘贴配置和 list.h 文件来复制 windows 上的工作场景(下面讨论):

来自 Doxygen 文档

EXPAND_ONLY_PREDEF

If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES then the macro expansion is limited to the macros specified with the PREDEFINED and EXPAND_AS_DEFINED tags.

The default value is: NO.

This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

EXPAND_AS_DEFINED

If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then this tag can be used to specify a list of macro names that should be expanded. The macro definition that is found in the sources will be used. Use the PREDEFINED tag if you want to use a different macro definition that overrules the definition found in the source code.

This tag requires that the tag ENABLE_PREPROCESSING is set to YES.

因此,EXPAND_AS_DEFINED 选项只有在 MACRO_EXPANSION 选项指定为 yes 时才有效(实际上不是)。

所以只需将MACRO_EXPANSION指定为yes并将list添加到EXPAND_AS_DEFINED。这将解决您的问题。

编辑

以下配置(仅相关选项)已通过 Doxygen 1.8.5、1.8.6 和 1.8.9.1(在 Win7 下)进行测试:

PROJECT_NAME           = "doxytest"
OUTPUT_DIRECTORY       = ./
OPTIMIZE_OUTPUT_FOR_C  = YES

TYPEDEF_HIDES_STRUCT   = YES

HIDE_SCOPE_NAMES       = YES
SHOW_NAMESPACES        = NO
INPUT                  = ./
FILE_PATTERNS          = *.h *.c

GENERATE_HTML          = YES
GENERATE_LATEX         = NO

ENABLE_PREPROCESSING   = YES
MACRO_EXPANSION        = YES
EXPAND_ONLY_PREDEF     = NO
SEARCH_INCLUDES        = YES
INCLUDE_PATH           = 
INCLUDE_FILE_PATTERNS  = 
PREDEFINED             =

其他选项保留默认值。

生成的输出是:

improperlydocumented Struct Reference


#include <list.h>

Public Member Functions


list_of_char_ptr* words

Detailed Description


This object is improperly documented.

Issue is that the list(char_ptr) is treated as a member function instead of a type..