假设我要在为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
有没有更好的方法来解决这个问题?
答案 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;
}