今天整理了下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
你猜猜是为什么?
分享到:
相关推荐
cppcheck是一款静态代码分析工具,主要用于C++编程语言。它能帮助开发者在代码编译之前发现潜在的错误和不良...通过学习和使用cppcheck的源码,我们可以更深入地理解C++编程和静态分析技术,从而更好地优化我们的项目。
cppcheck是一款开源的静态代码分析工具,主要用于C、C++...总的来说,cppcheck源代码是一个宝贵的教育资源,它不仅能够帮助我们学习和提升编程技能,还能够让我们深入了解静态代码分析这一领域,提升软件开发的水平。
7. **配置与命令行选项**:Cppcheck提供了丰富的配置选项,通过研究源代码,我们可以学习如何设计和实现一个用户友好的命令行工具。 8. **开源社区实践**:参与开源项目,如阅读和理解Cppcheck源代码,可以让我们...
对于“danmar-cppcheck-3b39139”这个文件,它很可能是一个特定版本的cpp-check源码库的快照。在这个版本中,我们可以期待找到cpp-check的源代码文件、构建脚本、测试用例以及其他相关文档。以下是一些关于cpp-check...
通过分析cppcheck-master.zip源码,我们可以学习其如何实现复杂的语法分析和错误检测逻辑。 2. cqual:此工具专注于C语言的类型安全,旨在帮助消除由于类型不匹配导致的运行时错误。cqual-0.981.tar.gz包含了工具的...
- **学习新技术**:当研究新的开源项目或框架时,Source Insight可以帮助快速理解和消化代码。 5. **源码分析与优化** - **依赖关系分析**:Source Insight可以展示函数间的调用关系,帮助分析代码的依赖性。 - ...
总之,"pcf_FORK_CHECK_GITLAB-源码.rar" 提供了一个学习和研究GitLab集成、源码管理和自动化工作流的宝贵资源。通过深入分析这个项目,开发者不仅可以提升自己的编程技能,还能更好地理解和应用GitLab的功能。
1. **cppcheck**:这是一个静态代码分析工具,能够检测出C/C++代码中的潜在错误,如未初始化的变量、空指针引用、内存泄漏等。将cppcheck集成到Source Insight中,可以实时地对代码进行检查,提高代码质量。 2. **...
CRC32(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于数据通信和存储领域的错误检测方法。它的主要功能是通过计算一个固定长度的校验码,来检查数据传输或存储过程中可能出现的错误。CRC32使用了多项式...
3. check_img_old.cpp 和 check_img.cpp:可能涉及到图像验证功能,用于防止作弊或确保游戏资源的完整性和安全性。 4. key.cpp:可能包含游戏的加密或授权系统,处理用户的账号验证和游戏密钥。 5. 32color.cpp:...
CRC8(Cyclic Redundancy Check,循环冗余校验)是一种广泛应用于数据通信和存储中的错误检测技术。它的核心思想是通过计算数据的校验和来验证数据的完整性,通常用于简单的错误检测,比如在串口通信、内存条检测、...
CRC(Cyclic Redundancy Check)是一种常用的错误检测方法,通过计算数据的校验和来判断数据的完整性。在驱动保护中,CRC可以用于验证驱动代码是否未经许可被修改。 "版本更新了,有两三个地方HS改掉了"这部分表明...
- **复选按钮**(Check Box):允许用户选择或取消选择一个选项。 - **单选按钮**(Radio Button):一组单选按钮中只能选中一个。 - **命令按钮**(Command Button):执行特定功能的按钮。 - **图标的按钮**:...
总的来说,这个C++编写的五子棋游戏源码提供了一个学习和探索游戏编程的平台,涵盖了数组结构、面向对象编程、算法设计等多个核心知识点。无论是对C++编程还是游戏开发感兴趣,都能从中获益匪浅。
2. 静态代码分析:FOCAS建议在代码编写阶段就使用静态代码分析工具,如Clang Static Analyzer或Cppcheck,这些工具可以在编译前检测出潜在的安全问题。 3. 动态内存管理:FOCAS提倡使用智能指针(如std::unique_ptr...
RKNN (Rapid Kernel Neural Network) 是一个针对嵌入式设备优化的深度学习推理框架,它旨在提供高效、低功耗的神经网络模型执行。在本压缩包中,"rknn_net.cpp" 和 "rknn_net.h" 文件是C++接口的实现,用于与RKNN...
4. **CRC.cpp**:CRC(Cyclic Redundancy Check,循环冗余校验)是一种常见的错误检测方法,用于确保数据传输的完整性。这里可能包含了CRC计算函数,用于验证MMS数据包在传输过程中的正确性。 5. **SMIL.cpp**:...
总结起来,"2048v3_2048终端界面版_源码"项目提供了一个独特的学习机会,让开发者可以深入研究C语言的编程技巧、控制台界面的开发,以及如何用算法实现经典游戏。通过阅读和分析"0.00.cpp"源代码,你可以提高自己的...
此外,静态代码分析工具如Cppcheck和Clang-Tidy可以帮助找出潜在的代码质量问题,提升代码的健壮性和可维护性。 在集成开发环境中,像Eclipse CDT和Code::Blocks这样的免费且开源的选择提供了类似Visual Studio的...