可以向库函数添加默认参数会破坏导入或使用吗?

时间:2016-08-07 18:19:32

标签: c++ unit-testing

在创建共享库时,我必须实现函数void foo(); foo()具有我想在单元测试中模拟的依赖项。我最初的想法是重写签名以包含默认参数,以便我可以注入依赖项。

一个选项是使用foo()作为bar()的包装,并为bar()编写单元测试,如下所示:

void bar(SomeClass *someObject=NULL);  // test this   
void foo() { 
    bar(); 
}

但是,我的问题是如何安全地修改foo()以获取默认参数而不破坏库导入或使用foo()?

我可以使用处理器根据构建设置(测试,调试,发布)重写签名;但问题仍然存在。我不记得C ++如何实现默认参数。

1 个答案:

答案 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])是函数类型的一部分。

因此,向函数添加默认参数将更改其签名,并要求使用新标头重新编译客户端。