假设我有如下功能:
void func1(...) {
...
...
func2(...);
...
...
}
在编译阶段,我在两个地方调用func1()
函数。但是,在其中一个地方,我不希望func2()
被执行。
因此,在编译期间我需要两个func1()
版本:一个 func2()
一个没有 { {1}}。
我知道以下方法。它们需要使电流源变形,我不愿意这样做
func2()
- >然后使用此宏定义具有不同名称的两个函数。#define
宏来控制执行路径。除上述方法外,您还知道其他任何方法吗?
答案 0 :(得分:4)
一种非常常见的方法是定义一个令牌并将调用包装在#ifdef
块中(检查令牌),不需要复制func1
即:
#define _INCLUDE_FUNC2_BUILD// or something
void func1(...) {
...
...
#ifdef _INCLUDE_FUNC2_BUILD
func2(...);
#endif // _INCLUDE_FUNC2_BUILD
...
...
}
显然,取决于您希望如何/在哪里加入#define
,您可以使用Jam之类的内容。
答案 1 :(得分:0)
而不是条件编译,特别是如果函数的其余部分是实质的,您可以传递一个参数来指示是否应该调用func2()
。该函数可以定义为:
void func1(..., bool call_func2) {
...
...
if (call_func2)
func2(...);
...
...
}
,一个电话可能是func1(..., true)
,另一个电话可能是func1(..., false)
。
如果您决定有时需要调用func2()
,有时需要调用func3()
,有时甚至不需要调用,可以将函数参数更改为指向函数的指针:
void func1(..., void (*funcN)(...)) {
...
...
if (funcN)
funcN(...);
...
...
}
然后您可以拥有func1(..., func2)
,func1(..., func3)
和func1(..., NULL)
。响应变化以适应。请注意,函数指针方案假定funcN
函数具有统一的接口。
否则,看看你是否需要重构函数。
void func1A(...) {
...
...
...before call to func2...
}
void func1B(...) {
...after call to func2...
...
...
}
void func1(...) {
func1A(...);
func1B(...);
}
void func1plus2(...) {
func1A(...);
func2(...);
func1B(...);
}
这些都比#ifdef
条件编译更好。首先,我可能会在界面中使用flag变量。