如何在具有返回类型的C ++中存根函数?

时间:2018-11-21 02:25:00

标签: c++

假设我要在为project2进行编译的情况下对函数进行存根,例如:

#ifdef PROJECT1
int func(int x) {x=1;return x;}
#else
int func(int x) {}
#endif

这不会起作用,因为编译器会抱怨该函数没有返回int。

但是我真的只是想对函数进行存根,基本上,我想在调用它时使它为空。

要解决此问题,我基本上必须将代码更改为:

#ifdef PROJECT1
int func(int x) {x=1;return x;}
#else
int func(int x) {return (int)0;}
#endif

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

那么您想在项目2的构建过程中忽略func吗?如果使用它或分配了结果的变量会怎样?这会在您的代码中产生未定义/不必要的后果吗?即使您要为不同的项目拥有两个单独的存储库,您肯定会尝试一种更好的方法。

允许在构建2中删除func的每个调用,因为它仍然可以编译,您可以执行某种形式的宏魔术。尽管对于某些内部实验之外的任何事情来说,这都是一个坏主意。

#ifdef PROJECT1 
  int func(int x) {x=1; return x;}

  #define FUNC(x) func(x)/* Call the function */ 

  #define FUNC_ASSIGN(x, var) var = func(x)/* Call the function and store result in var*/ 

#else 

  #define FUNC(x)/* NULLED OUT */ 

  #define FUNC_ASSIGN(x, var)/* NULLED OUT */  

#endif

#include <iostream>

int main() {
  int x = 2;
  FUNC_ASSIGN(5, x);
  std::cout << x;

  return 1;
}

程序将打印不同的结果,具体取决于是否定义了PROJECT1。注意,这种方式不能直接声明和分配变量auto x = func(1)。这是因为如果我们将func设为NULL,那么使用x会发生什么?

答案 1 :(得分:1)

假设所有可存根函数都返回一个int,并且您希望它们成为无操作,则在存根后返回0,这样的模式将非常简洁:

#ifdef ENABLE_STUBS
# define STUB_CHECK return 0
#else
# define STUB_CHECK
#endif

int func(int x)
{
   STUB_CHECK;

   x = 1;
   return x;
}

如果您需要为要返回的存根函数指定不同/非零值,则可以扩展STUB_CHECK宏以接受一个参数:

#ifdef ENABLE_STUBS
# define STUB_CHECK(x) return x
#else
# define STUB_CHECK(x)
#endif

int func(int x)
{
   STUB_CHECK(6);

   x = 1;
   return x;
}