1

假设,我有一个原型函数,如 (in function.h)

void function(int argument, bool flag);

此函数有两种变体行为,取决于flag.

早些时候,在一个模块 ( module.h, module.c) 中,我调用了该函数:

#include "function.h"

function(argument1, true);
function(argument2, false);

让我们进一步假设,我想将此函数传递给一个模块,反转该依赖关系:

void (* funcPtr)(int argument, bool flag);

void setFuncPtr(void (* func)(int argument, bool flag))
{
  funcPtr = func;
}

现在我可以拥有function.c

#include "module.h"

setFuncPtr(function);

并在module.h

funcPtr(argument1, true);
funcPtr(argument2, false);

有没有办法拥有两个指针,每个指针都指向函数,但具有不同的硬编码值flag?喜欢:

void (* funcPtrTrue)(int argument, bool flag);
void (* funcPtrFals)(int argument, bool flag);
/* Or, even better
void (* funcPtrTrue)(int argument);
void (* funcPtrFals)(int argument);
*/

void setFuncPtr(void (* func)(int argument, bool flag))
{
  funcPtrTrue  = func(argument, true);
  funcPtrFalse = func(argument, false);

}

(我现在,这不是正确的代码,但应该说明所需的功能)

在 Olis 提议之后,让我们把事情复杂化。bool是一个类型定义function.h

typedef enum {
  FALSE,
  TRUE
} bool;

现在我必须function.h再次包含module.c以使其再次工作。

#include "function.h"

void functionTrue(int argument)
{
  fktPtr(argument, TRUE);
}
4

2 回答 2

4

C 没有默认参数。

我认为您需要两个单独的函数指针是有充分理由的,而不是直接funcPtr使用所需的flag参数进行调用。如果是这样,为什么不在你的模块里有两个包装函数呢?

void (* funcPtr)(int argument, bool flag);

void setFuncPtr(void (* func)(int argument, bool flag)) {
  funcPtr = func;
}

void funcTrue(int argument)  { funcPtr(argument, true); }
void funcFalse(int argument) { funcPtr(argument, false); }
于 2013-03-25T12:40:20.073 回答
1

你可以使用结构

struct funcstruct {
    void (*func)(int arg, bool flag);
    bool default_flag;
} funcstruct;

struct funcstruct funcPtrTrue, funcPtrFalse;

void setFuncPtr(void (* func)(int argument, bool flag))
{
  funcPtrTrue.func = func; funcPtrTrue.default_flag = true;
  funcPtrFals.func = func; funcPtrFals.default_flag = false;

}
于 2013-03-25T13:02:39.297 回答