在创建共享库时,我必须实现函数void foo();
foo()具有我想在单元测试中模拟的依赖项。我最初的想法是重写签名以包含默认参数,以便我可以注入依赖项。
一个选项是使用foo()作为bar()的包装,并为bar()编写单元测试,如下所示:
void bar(SomeClass *someObject=NULL); // test this
void foo() {
bar();
}
但是,我的问题是如何安全地修改foo()以获取默认参数而不破坏库导入或使用foo()?
我可以使用处理器根据构建设置(测试,调试,发布)重写签名;但问题仍然存在。我不记得C ++如何实现默认参数。
答案 0 :(得分:0)
回想一下,声明中指定了默认参数(除非函数是内联的):
void foo(int i, const char* p=nullptr);
void foo(int i, const char* p) {
//...
}
填充默认参数的责任落在调用者身上:https://godbolt.org/g/8z63qA
在幕后,函数签名是具有完整参数集的函数,因此这两个函数具有相同的签名:
void foo(int i, const char* p);
void foo(int i, const char* p=nullptr);
8.3.5 / 8 dcl.fct
返回类型,参数类型列表,ref-qualifier,cv-qualifier-seq,以及函数是否具有非抛出异常规范,但不是默认参数([dcl.fct。默认])或异常规范([except.spec])是函数类型的一部分。
因此,向函数添加默认参数将更改其签名,并要求使用新标头重新编译客户端。