在C中编译时改变函数体

时间:2017-03-27 15:45:58

标签: c function directive conditional-compilation

假设我有如下功能:

void func1(...) {
    ...
    ...
    func2(...);
    ...
    ...
}

在编译阶段,我在两个地方调用func1()函数。但是,在其中一个地方,我不希望func2()被执行。

因此,在编译期间我需要两个func1()版本:一个 func2()一个没有 { {1}}。

我知道以下方法。它们需要使电流源变形,我不愿意这样做

  1. 将整个功能放在func2() - >然后使用此宏定义具有不同名称的两个函数。
  2. 将函数体放入另一个头文件,并使用#define宏来控制执行路径。
  3. 除上述方法外,您还知道其他任何方法吗?

2 个答案:

答案 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变量。