【问题标题】:How to create a typedef for function pointers如何为函数指针创建 typedef
【发布时间】:2012-06-14 17:38:41
【问题描述】:

我认为如果我为函数指针创建一个 typedef 会更容易使用函数指针,但我似乎在某些语法或用法或关于函数指针的 typedef 的某些东西上绊倒了,我可以使用一些帮助。

我有

int foo(int i){ return i + 1;}
typedef <???> g;
int hvar;
hvar = g(3)

这基本上就是我想要完成的事情。我是一个相当新的 C 程序员,这让我太过分了。什么取代了&lt;???&gt;

【问题讨论】:

  • 您的代码不可能工作,因为如果 g 是 typedef,您就不能将其作为函数调用。你能具体描述一下你想要做什么吗?
  • 真的吗?我以为我的老板告诉我使用 typedef 来完成这项工作。你能用#Define 完成类似的事情吗?
  • 你具体想做什么?目前尚不清楚您要做什么。
  • 通过使用定义你可以做#define g foo然后int hvar; hvar = g(3);
  • 您必须首先执行 typedef(我想是一个函数指针),然后 使用 typedef 来定义一个变量(指向函数的类型指针)用你想要的函数,而不是使用该变量来调用它所指向的函数。

标签: c function-pointers typedef


【解决方案1】:

你的问题不清楚,但我想你可能想要这样的东西:

int foo(int i){ return i + 1;}

typedef int (*g)(int);  // Declare typedef

g func = &foo;          // Define function-pointer variable, and initialise

int hvar = func(3);     // Call function through pointer

【讨论】:

  • 函数类型也可以typedef,这有点不常见,但为了说明可能更清楚:typedef int g(int); g foo; g *func = &amp;foo;。这对于声明(不幸的是,没有定义)具有相同签名的多个函数很有用。
  • @JonPurdy 建议将其发布为答案
【解决方案2】:

你是对的。函数指针可方便地用于指向具有相同返回类型并采用相同数量参数的不同函数。 参数类型应与函数指针参数的声明相匹配。

在您的情况下,您可以将函数指针 g 定义为:

typedef int (*g)(int); // 函数指针的typedef

g 是一个函数指针,用于返回 int 值并采用一个 int 参数的函数。

函数指针的用法可以用下面一个简单的程序来说明:

#include<stdio.h>

typedef int (*pointer_to_function)(int first_parameter_of_type_int, int second_parameter_of_type_int);

int my_function_returning_int_and_taking_two_int_arguments(int par1, int par2)
{
    int result = par1 + par2;
    return result;
}

int my_mul_function(int par1, int par2)
{
    int result = par1 * par2;
    return result;
}

int main()
{
    int res; // returning result will be here
    pointer_to_function my_fun_pointer; // declare function pointer variable;

    my_fun_pointer = my_function_returning_int_and_taking_two_int_arguments; // function pointer points to `my_function_returning_int_and_taking_two_int_arguments` function
    res = my_fun_pointer(2,3);       // Call function through pointer
    printf(" result of `my_function_returning_int_and_taking_two_int_arguments` = %d \n", res);


    my_fun_pointer = my_mul_function; // now function pointer points to another function: `my_mul_function` 
    res = my_fun_pointer(2,3);       // Call function through pointer
    printf(" result of `my_mul_function` = %d \n", res);

   return 0;
}

输出:

result of `my_function_returning_int_and_taking_two_int_arguments` = 5 
result of `my_mul_function` = 6 

【讨论】:

    【解决方案3】:

    函数返回函数指针的原始写法是

    int (* call(void) ) (int,int);
    

    这里的call 是一个函数,它只接受一个函数指针,它接受两个参数并返回一个整数值。注意括号,它们是绝对必要的。

    代码如下:

    #include<stdio.h>
    
    int sum(int a,int b)   //sum is the function returned by call
    {
       return a+b;
    }
    
    int (*call(void) ) (int ,int);
    
    int main() {
      int (*p)(int,int);   // way to declare a function pointer
      p=call();
      printf("%d\n",(*p)(8,3));
    }
    
    int( *call(void) )(int,int) {
        return sum;
    }
    

    【讨论】:

    • 这与问题有什么关系?
    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多