今天整理了下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
你猜猜是为什么?
分享到:
相关推荐
Qt Creator plugin动手实践(4)修改qtc-cppcheck源码,快捷使用cppcheck
cppcheck源码编译安装,火焰图FlameGraph-1.0
cppcheck 1.56版本源码,VS 2005调试通过。
cppcheck编写自定义规则文档,cppcheck支持自定义规则,通过正则表达式编写检查规则
cppcheck操作手册
cppcheck用于sourceinsight上静态代码检测,亲测能正常使用,相比pc-lint的好处是,不需要检测头文件。
作为编译器的一种补充检查,cppcheck对产品的源代码执行严格的逻辑检查,还支持第三方的代码规则检查,譬如最常见的汽车行业的规范misra,目前github上的资源https://github.com/danmar/cppcheck的资源,可以检查...
cppcheck添加到VS2005中的方法,亲测可用使用!
cppcheck 是一个静态代码检查工具,支持c, c++ 代码;作为编译器的一种补充检查,cppcheck对产品的源代码执行严格的逻辑检查。 执行的检查包括: 1. 自动变量检查 2. 数组的边界检查 3. class类检查 4. 过期的函数,...
cppcheck_win10安装包.zip
Atom-atom-linter-cppcheck.zip,使用cppcheck的atom短绒此软件不再维护!,atom是一个用web技术构建的开源文本编辑器。
该文档为vs中配置cppcheck工具的文档说明,浅显易懂。希望各位喜欢。
详细介绍cppcheck静态代码检测工具的使用
CppCheck extension for VC
Cppcheck2.6帮助手册-中文版
为了cppcheck进行静态分析。 设置cppcheck来查找一些自定义规则,writing-rules-2.pdf writing-rules-1.pdf
cppcheck 是一个静态代码检查工具,支持c, c++ 代码;作为编译器的一种补充检查,cppcheck对产品的源代码执行严格的逻辑检查。
cppcheck是C/C++语言的静态检查工具,不同于语法检查,他主要模拟编译器的规则实现静态检查,1、安装cppcheck,自己官方下吧 ,2、将插件复制到Eclipse CDT安装目录的plugin文件夹,3、启动Eclipse,window-...
针对开源软件缺陷检测工具Cppcheck软件存在的不足,主要分析了Cppcheck架构、缺陷模式表示与实现,在对已收集350个缺陷模式分析总结基础上,对其完善,提高缺陷检测能力。通过两组实验验证改进Cppcheck工作的有效性...
cppcheck source code