【问题标题】:doxygen misrendering macro type as public member functiondoxygen 将宏类型错误渲染为公共成员函数
【发布时间】:2015-08-13 21:34:05
【问题描述】:

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

主sn-p

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

问题

doxygen 错误地将这种类型 [list(char_ptr)] 渲染为 公共成员函数(而不是成员数据)。

环境信息

$ 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

我的代码/配置:


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

氧气输出

未正确记录的结构参考


#include

公共成员函数


list (char_ptr)*words

详细说明


此对象的文档记录不正确。

问题是 list(char_ptr) 被视为成员函数 而不是类型..


问题

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


配置尝试
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 上的工作场景(下面讨论):

【问题讨论】:

  • 你有EXPAND_ONLY_PREDEF = YES,它不会扩展list。您可以尝试将其设置为否。或者你可以试试PREDEFINED += list(x)=list_type_##x。这两个都没试过。
  • 尝试 EXPAND_ONLY_PREDEF = NO,并明确将宏定义添加到 PREDEFINED,均未解决问题
  • 请注意,关于 EXPAND_AS_DEFINED 的bug 已在 v1.8.6 中得到更正,此外,v1.7.4 已修复一些宏扩展的错误。
  • 您的问题似乎没有被其他用户复制。为了帮助您更多,您能否与所有选项共享完整的配置文件(通过从 doxywizard 中保存)?通过互联网剪贴板或您想要的共享它(但不是在 OP 中,它很长......)。
  • @Bentoy13 我添加了一个指向我从doxygen -g得到的输出的链接

标签: c macros doxygen


【解决方案1】:

来自 Doxygen 文档

EXPAND_ONLY_PREDEF

如果 EXPAND_ONLY_PREDEF 和 MACRO_EXPANSION 标记都设置为 YES,则宏扩展仅限于使用指定的宏 PREDEFINED 和 EXPAND_AS_DEFINED 标签。

默认值为:否。

此标签要求标签 ENABLE_PREPROCESSING 设置为 YES。

EXPAND_AS_DEFINED

如果 MACRO_EXPANSION 和 EXPAND_ONLY_PREDEF 标签设置为 YES,那么该标签可用于指定宏名称列表 被扩大。在源代码中找到的宏定义将是 用过的。如果要使用不同的宏,请使用 PREDEFINED 标记 覆盖源代码中的定义的定义。

此标签要求标签 ENABLE_PREPROCESSING 设置为 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             =

其他选项保留其默认值。

生成的输出是:

未正确记录的结构参考


#include <list.h>

公共成员函数


list_of_char_ptr* words

详细说明


此对象的文档记录不正确。

问题是 list(char_ptr) 被视为成员函数 而不是类型..

【讨论】:

  • 感谢@randomusername,我将此尝试添加到我的问题中(如果我解释正确),但输出仍然相同
  • @amdixon 是一模一样还是新的函数定义变成了force_append_macro (list_of_, char_ptr) *words;
  • 完全一样(我删除了 html 文件夹以避免任何可能的缓存问题)
  • @amdixon 我已经用 Doxygen 1.8.5 测试了这个解决方案,它工作正常。我什至停用了 EXPAND_ONLY_PREDEF 选项,同样的好输出。你用的是哪个版本?
  • @Bentoy13 im on version 1.8.6.. doxygen 做任何系统缓存吗?
猜你喜欢
  • 2012-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多