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 向导生成以下输出:
我的 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..
我正在使用类型宏 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 向导生成以下输出:
我的 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..