条件函数定义

时间:2014-10-27 02:57:00

标签: c function function-pointers

我有一个很长时间循环的代码。在这个while循环中,有一个很长的switch-case函数,以便知道应该在bar上应用哪个函数。

int i=0;
while(i<BigNumber)
{
   switch(variable)
   {
      case 1:
          foo1(bar);
      case 2:
          foo2(bar);
      etc...
   }
   i = i+1;
}

然而,从这个while循环的一次迭代到另一次循环,switch-case结构中的情况总是相同的。因此,我认为在while循环之前定义要在foo上应用的唯一函数bar会更聪明,但是我可以对foo进行此条件定义吗?像

这样的东西
switch(variable)
{
   case 1:
      define foo this way
   case 2:
      define foo that way
   etc...
}

int i=0;
while(i<BigNumber)
{
   foo(bar);
   i = i+1;
}

但是无法在main中定义函数,因此此代码无法编译。我该如何解决这个问题?有没有办法定义一个有条件的函数?最好的解决方案是创建一个指向函数的指针数组,然后通过像(*myarray[variable])(bar)那样调用while循环中的正确函数吗?

2 个答案:

答案 0 :(得分:1)

详细说明happydave的评论

void (*foo)(int);

switch(variable)
{
   case 1:
      foo = foo1; // or foo = &foo1; // & is optional
   case 2:
      foo = foo2;
   etc...
}

int i=0;
while(i<BigNumber)
{
   foo(bar); // (*foo)(bar); also works
   i = i+1;
}

答案 1 :(得分:1)

在这里,函数指针是量身定制的,以解决这类挑战。您将定义正常函数foo1foo2以及您可能需要的其他函数。然后,使用语法function pointer定义return type (*fpointername)(arg, list);您的arglist参数只是要分配的函数的type。 (例如,如果你的函数是void foo1 (int a, char b),那么你将函数指针声明为void (*fpointername)(int, char);(fn指针定义中省略了变量名)。

以下是一个简单的程序,说明了这一点。如果您有任何问题,请发表评论:

#include <stdio.h>

/* 3 void functions, one of which will become foo
 * dependeing on the outcome of the switch statement
 */
void foo1 (char c) {
    printf ("\n  %s(%c)\n\n", __func__, c);
}

void foo2 (char c) {
    printf ("\n  %s(%c)\n\n", __func__, c);
}

void foodefault (char c) {
    printf ("\n  %s(%c)\n\n", __func__, c);
    printf ("  Usage: program char [a->foo1, b->foo2, other->foodefault]\n\n");
}

/* simple program passes argument to switch
 * statement which assigns function to function
 * pointer 'foo ()' based on switch criteria.
 */
int main (int argc, char **argv) {

    void (*foo)(char) = NULL;               /* function pointer initialized to NULL */
    char x = (argc > 1) ? *argv[1] : 'c';   /* set 'x' value depending on argv[1]   */

    switch (x)                              /* switch on input to determine foo()   */
    {
        case 'a' :                          /* input 'a'                            */
            foo = &foo1;                    /* assign foo as foo1                   */
            break;
        case 'b' :                          /* input 'b'                            */
            foo = &foo2;                    /* assign foo as foo2                   */
            break;
        default :                           /* default case assign foo foodefault   */
            foo = &foodefault;
    }

    foo (x);                                /* call function foo(x)                 */

    return 0;
}

<强>输出:

$ ./bin/foofn

  foodefault(c)

  Usage: program char [a->foo1, b->foo2, other->foodefault]

$ ./bin/foofn a

  foo1(a)

$ ./bin/foofn b

  foo2(b)

$ ./bin/foofn d

  foodefault(d)

  Usage: program char [a->foo1, b->foo2, other->foodefault]