`
Goldice
  • 浏览: 108253 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多

今天整理了下cppcheck的源码结构,为什么通过写一个个子文件就能够扩展cppcheck的功能呢?

 

看了下代码,并通过简化代码,略懂一二了。

 

    首先我们定义一个基类test.h,只定义一个头文件足够:

 

 

#ifndef TESTH
#define TESTH

#include<iostream>
#include<list>

class Test 
{
  public:
  Test(const std::string name);
  ~Test(){ 
    std::cout << "Test End" << std::endl;
  }

  static std::list<Test *> &instances()
  {
    static std::list<Test *> _instances;
    return _instances;
  }

  virtual void print()
  { }
};

inline Test::Test(const std::string name)
{
  instances().push_back(this);
  instances().sort(std::less<Test *>());
}
#endif

 

      这个基类非常简洁,注意它定义了一个static的Test类指针list,然后初始化的时候直接调用instance函数,相当于生成了预定义了一个list,而print函数是virtual的。

      然后我们写一个继承类,先写一个头文件testF.h

 

#ifndef TESTFH
#define TESTFH
#include"test.h"
class TestF : public Test
{
  public:
  TestF() : Test(myname())
  { }
  
  std::string myname() const
  {
    return "TestF";
  }

  void print();
};
#endif

 

 再写testF.cpp文件:

 

#include"testF.h"

namespace{
  TestF instance;
}

void TestF::print()
{
    std::cout << myname() << std::endl;
}

     这个cpp文件直接在namespace初始化了一个TestF实例。这样由于TestF类是继承自Test类,而Test类会生成一个static 的list,而把这个例加入到这个list中,这样子,这个TestF类的实例就加入到了static的list中去了。

     那我们的main函数就可以这样写了。main.cpp

 

#include"test.h"
#include"testF.h"

int main(void)
{
  Test test("Test1");
  for(std::list<Test *>::iterator it=test.instances().begin();it != test.instances().end();it++)
  {
    (*it)->print();
  }
}

      定义这样一个Test实例只是为了取出本来已经存在的static list中的数据,呵呵。

使用命令:

 

g++ -o main main.cpp testF.cpp testF.h test.h

然后调用:./main

得到结果:

 

TestF

Test End

Test End

 

如果我们用TestF test 取代 Test test("test1")呢?

结果是:

 

TestF

TestF

Test End

Test End

 

你猜猜是为什么?

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    cppcheck源码

    cppcheck是一款静态代码分析工具,主要用于C++编程语言。它能帮助开发者在代码编译之前发现潜在的错误和不良...通过学习和使用cppcheck的源码,我们可以更深入地理解C++编程和静态分析技术,从而更好地优化我们的项目。

    cppcheck source code

    cppcheck是一款开源的静态代码分析工具,主要用于C、C++...总的来说,cppcheck源代码是一个宝贵的教育资源,它不仅能够帮助我们学习和提升编程技能,还能够让我们深入了解静态代码分析这一领域,提升软件开发的水平。

    Cppcheck源代码

    7. **配置与命令行选项**:Cppcheck提供了丰富的配置选项,通过研究源代码,我们可以学习如何设计和实现一个用户友好的命令行工具。 8. **开源社区实践**:参与开源项目,如阅读和理解Cppcheck源代码,可以让我们...

    cpp-check 源码

    对于“danmar-cppcheck-3b39139”这个文件,它很可能是一个特定版本的cpp-check源码库的快照。在这个版本中,我们可以期待找到cpp-check的源代码文件、构建脚本、测试用例以及其他相关文档。以下是一些关于cpp-check...

    代码审查工具源码合集

    通过分析cppcheck-master.zip源码,我们可以学习其如何实现复杂的语法分析和错误检测逻辑。 2. cqual:此工具专注于C语言的类型安全,旨在帮助消除由于类型不匹配导致的运行时错误。cqual-0.981.tar.gz包含了工具的...

    Source Insight及其使用指南

    - **学习新技术**:当研究新的开源项目或框架时,Source Insight可以帮助快速理解和消化代码。 5. **源码分析与优化** - **依赖关系分析**:Source Insight可以展示函数间的调用关系,帮助分析代码的依赖性。 - ...

    pcf_FORK_CHECK_GITLAB-源码.rar

    总之,"pcf_FORK_CHECK_GITLAB-源码.rar" 提供了一个学习和研究GitLab集成、源码管理和自动化工作流的宝贵资源。通过深入分析这个项目,开发者不仅可以提升自己的编程技能,还能更好地理解和应用GitLab的功能。

    sourceinsight及其插件使用.zip

    1. **cppcheck**:这是一个静态代码分析工具,能够检测出C/C++代码中的潜在错误,如未初始化的变量、空指针引用、内存泄漏等。将cppcheck集成到Source Insight中,可以实时地对代码进行检查,提高代码质量。 2. **...

    CRC32校验程序源码

    CRC32(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于数据通信和存储领域的错误检测方法。它的主要功能是通过计算一个固定长度的校验码,来检查数据传输或存储过程中可能出现的错误。CRC32使用了多项式...

    luosidll.zip_石器_石器源码_石器螺丝_螺丝石器_螺丝石器判决

    3. check_img_old.cpp 和 check_img.cpp:可能涉及到图像验证功能,用于防止作弊或确保游戏资源的完整性和安全性。 4. key.cpp:可能包含游戏的加密或授权系统,处理用户的账号验证和游戏密钥。 5. 32color.cpp:...

    CRC8异或校验源码

    CRC8(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于数据通信和存储中的错误检测技术。它的核心思想是通过计算数据的校验和来验证数据的完整性,通常用于简单的错误检测,比如在串口通信、内存条检测、...

    HS驱动保护源码

    CRC(Cyclic Redundancy Check)是一种常用的错误检测方法,通过计算数据的校验和来判断数据的完整性。在驱动保护中,CRC可以用于验证驱动代码是否未经许可被修改。 "版本更新了,有两三个地方HS改掉了"这部分表明...

    各种各样的按钮(VC源码)

    - **复选按钮**(Check Box):允许用户选择或取消选择一个选项。 - **单选按钮**(Radio Button):一组单选按钮中只能选中一个。 - **命令按钮**(Command Button):执行特定功能的按钮。 - **图标的按钮**:...

    C++写的五子棋源码.rar

    总的来说,这个C++编写的五子棋游戏源码提供了一个学习和探索游戏编程的平台,涵盖了数组结构、面向对象编程、算法设计等多个核心知识点。无论是对C++编程还是游戏开发感兴趣,都能从中获益匪浅。

    FOCAS 介绍,focas是什么意思,C,C++源码.zip

    2. 静态代码分析:FOCAS建议在代码编写阶段就使用静态代码分析工具,如Clang Static Analyzer或Cppcheck,这些工具可以在编译前检测出潜在的安全问题。 3. 动态内存管理:FOCAS提倡使用智能指针(如std::unique_ptr...

    RKNN NET C++封装源码源码文件

    RKNN (Rapid Kernel Neural Network) 是一个针对嵌入式设备优化的深度学习推理框架,它旨在提供高效、低功耗的神经网络模型执行。在本压缩包中,"rknn_net.cpp" 和 "rknn_net.h" 文件是C++接口的实现,用于与RKNN...

    MMS发送源码

    4. **CRC.cpp**:CRC(Cyclic Redundancy Check,循环冗余校验)是一种常见的错误检测方法,用于确保数据传输的完整性。这里可能包含了CRC计算函数,用于验证MMS数据包在传输过程中的正确性。 5. **SMIL.cpp**:...

    2048v3_2048终端界面版_源码

    总结起来,"2048v3_2048终端界面版_源码"项目提供了一个独特的学习机会,让开发者可以深入研究C语言的编程技巧、控制台界面的开发,以及如何用算法实现经典游戏。通过阅读和分析"0.00.cpp"源代码,你可以提高自己的...

    C或C++工具

    此外,静态代码分析工具如Cppcheck和Clang-Tidy可以帮助找出潜在的代码质量问题,提升代码的健壮性和可维护性。 在集成开发环境中,像Eclipse CDT和Code::Blocks这样的免费且开源的选择提供了类似Visual Studio的...

Global site tag (gtag.js) - Google Analytics