Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 函数指针和默认参数_C_Function Pointers - Fatal编程技术网

C 函数指针和默认参数

C 函数指针和默认参数,c,function-pointers,C,Function Pointers,让我们假设,我有一个函数,它的原型类似于function.h 此函数有两种不同的行为,具体取决于标志 早期,在module.h和module.c模块中,我调用了该函数: #include "function.h" function(argument1, true); function(argument2, false); 让我们进一步假设,我想将此函数传递到一个模块中,反转依赖关系: void (* funcPtr)(int argument, bool flag); void setFu

让我们假设,我有一个函数,它的原型类似于function.h

此函数有两种不同的行为,具体取决于标志

早期,在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;
}
现在我可以在函数中使用。c:

在模块h中:

有没有一种方法可以让两个指针都指向函数,但具有不同的标志硬编码值?比如:

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

建议之后,让我们把事情复杂化。bool是函数中的typedef。h:

现在我必须再次将function.h包含到module.c中,以使其再次工作

#include "function.h"

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

C没有默认参数

我假设您需要两个独立的函数指针,而不是使用所需的标志参数直接调用funcPtr,这是有充分理由的。如果是这样,为什么不在您的模块中只使用两个包装器函数呢

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); }

C没有默认参数

我假设您需要两个独立的函数指针,而不是使用所需的标志参数直接调用funcPtr,这是有充分理由的。如果是这样,为什么不在您的模块中只使用两个包装器函数呢

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); }
您可以使用结构

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;

}
您可以使用结构

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;

}

不,不可能。函数指针是一个地址。它不包含任何更多的信息,因为参数检查是编译时的,而不是运行时的。像奥利建议的那样使用包装纸。不,不可能。函数指针是一个地址。它不包含任何更多的信息,因为参数检查是编译时的,而不是运行时的。用包装纸,就像奥利建议的那样。好的,这很有帮助。还有一点。假设,flag不是bool,而是typedef枚举。现在我需要以某种方式包含typedef,但使用函数指针setter,我想完全颠倒这种依赖关系。@Oliver:那么,您希望您的模块具有一个公共API函数,与setFuncPtrfuncPtr、argouse类似吗?我不确定我是否理解您的意思。我想隐藏控制函数的枚举。应隐藏function.h,并且模块.h的API应在没有function.h的情况下可用。我想在不改变模块接口的情况下替换function.h.@Oliver:我的意思是,你打算如何注入flag的值?啊,我明白了。至于问题,问题出在哪里:一点也不。我只需要函数的一个行为,因此标志只有一个值。这就是为什么我不想将枚举的整个接口公开给外部。好的,这很有帮助。还有一点。假设,flag不是bool,而是typedef枚举。现在我需要以某种方式包含typedef,但使用函数指针setter,我想完全颠倒这种依赖关系。@Oliver:那么,您希望您的模块具有一个公共API函数,与setFuncPtrfuncPtr、argouse类似吗?我不确定我是否理解您的意思。我想隐藏控制函数的枚举。应隐藏function.h,并且模块.h的API应在没有function.h的情况下可用。我想在不改变模块接口的情况下替换function.h.@Oliver:我的意思是,你打算如何注入flag的值?啊,我明白了。至于问题,问题出在哪里:一点也不。我只需要函数的一个行为,因此标志只有一个值。这就是为什么我不想将枚举的整个接口公开给外部。
#include "function.h"

void functionTrue(int argument)
{
  fktPtr(argument, TRUE);
}
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); }
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;

}