diff --git a/README.md b/README.md index 1d80f818340fc067be33f5d269071efd990edd83..563f5d4fc2dfef6e0489cb75aba6406a714b7e84 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,8 @@ 基于`cpp-stub`的功能扩展模块,提供更加丰富,方便的功能。 更加高效地在单元测试中打桩。 +基于`Linux` 系统与 `gcc/g++`编译器开发(其他平台与编译器未做测试) + # 安装教程 1. 在[Github](https://github.com/coolxv/cpp-stub)或者[Gitee](https://gitee.com/coolxv/cpp-stub)下载`cpp-stub`; 2. 将`cpp-stub-ext`与`cpp-stub`一起导入工程; @@ -11,6 +13,8 @@ # 特性 - 支持使用`lamda`函数打桩 +- 便捷地获取虚函数地址 +1. 支持`gcc/g++` - 更多特性开发中... # 使用说明 @@ -76,7 +80,7 @@ class Test { public: int test(){return m;} - int ret_test(int a){return m + a;} + int ret_test(int a) const {return m + a;} int add_test(int a ,int b) {return m + a + b;} private: int m = 1; @@ -106,7 +110,7 @@ class Test { public: int test(){return m;} - int ret_test(int a){return m + a;} + int ret_test(int a) const {return m + a;} int add_test(int a ,int b) {return m + a + b;} private: int m = 1; @@ -173,6 +177,45 @@ int main(int argc, char *argv[]) return 0; } ``` +## 虚函数地址 +使用`VDDR()`便捷地获取虚函数地址。 +由于功能实现采用的`gcc/g++`的转换方法,目前应该只支持`gcc/g++`编译器 +### 示例 +```c++ +#include "stubext.h" +using namespace stub_ext; + +class Test +{ +public: + virtual int test() {return 0;} +}; +class TestB : public Test +{ +public: + virtual int test() {return 1;} +}; +static int foo_stub() +{ + return 9; +} + +int main(int argc, char *argv[]) +{ + int dd = -1; + StubExt st; + st.set_lamda(VADDR(Test,test),[&dd](){dd = 5; return dd;}); + st.set(VADDR(TestB,test),&foo_stub); + + Test *t1 = new Test; + Test *t2 = new TestB; + int r1 = t1->test(); + int r2 = t2->test(); + delete t1; + delete t2; + return 0; +} +``` # 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 diff --git a/stub-ext/stub-shadow.h b/stub-ext/stub-shadow.h index 063ab890c277eff7be5404f577e6346c2ab7cdc3..f2fa03a38732c5014feaebfca6f8a9ff0c07f73d 100644 --- a/stub-ext/stub-shadow.h +++ b/stub-ext/stub-shadow.h @@ -50,6 +50,23 @@ public: Lamda _func; }; +template +struct VFLocator +{ + +}; + +template +struct VFLocator +{ + typedef Ret (*Func)(Obj*, Args...); +}; + +template +struct VFLocator +{ + typedef Ret (*Func)(Obj*, Args...); +}; template struct LamdaCaller @@ -119,6 +136,7 @@ struct FuncShadow } }; + template struct FuncShadow { diff --git a/stub-ext/stubext.h b/stub-ext/stubext.h index 808c6a8621d40c12c5fafe7dd5427e0fe7d49b7e..d4fae6f99041670578ed4d9ab497e6049debec01 100644 --- a/stub-ext/stubext.h +++ b/stub-ext/stubext.h @@ -33,6 +33,8 @@ #include "stub-shadow.h" namespace stub_ext { +#define VADDR(CLASS_NAME,MEMBER_NAME) (typename VFLocator::Func)(&CLASS_NAME::MEMBER_NAME) + class StubExt : public Stub { public: