【问题标题】:A weird type of defining a function定义函数的一种奇怪类型
【发布时间】:2018-09-09 08:19:19
【问题描述】:

我学习 C 1 年,我看到了一种定义函数的方法。我无法命名它,所以我想知道定义函数的名称。

我们将函数定义为标准:

FunctionReturnType FunctionName(FunctionArgs)
{
  codes();
}

但我看到了那种类型:

FunctionReturnType FunctionName(FunctionArgs)(TheWeirdArea)
{
  codes();
}

那么我们在命名为 TheWeirdArea 中的目的是什么?我猜它与函数参数有关,但我想正确地知道我们在 TheWeirdArea 中做了什么。

【问题讨论】:

  • 这意味着FunctionName返回一个以TheWeirdArea为参数并返回FunctionReturnType的函数(希望是指针)。像int (*foo(int))(int);foo 接受一个int 并返回一个指向函数的指针,该函数接受一个int 并返回一个int
  • 你的意思是__attribute__ ?
  • 我们可以用顺时针/螺旋规则的东西来比较它吗? c-faq.com/decl/spiral.anderson.html@mch
  • 如果这是我在评论中猜到的,是的。你也可以在这里输入:cdecl.org

标签: c function user-defined-functions


【解决方案1】:

我猜这是关于返回一个函数指针,指向一个看起来像这样的函数

FunctionReturnType func(TheWeirdArea);

这是一个例子:

#include <stdio.h>

int bar1(int b)
{
    printf("bar1\n");
    return 42 + b;
}

int bar2(int b)
{
    printf("bar2\n");
    return 100 + b;
}

int (*foo(int a))(int b)  // Returns a function pointer
{
    if (a == 1) return bar1;
    return bar2;
}

int main(void) {
    printf("%d\n", foo(1)(100));
    printf("%d\n", foo(2)(200));
    return 0;
}

输出:

bar1
142
bar2
300

【讨论】:

  • 哦!真的谢谢!我理解我们为什么使用它。也非常感谢@Yasser Mohamed
【解决方案2】:

希望这个虚拟示例对您有所帮助

int add(int x,int y)
{
return x+y;   //very dummy function return x+y
}


typedef int (*pointer_to_add)(int,int);
/* this is a declaration of  function pointer works 

with any function has an int return type and

 accept two int arguments not only add */

int (*my_function(int arg1, double arg2))(int, int)
{
   /*This a function accept an int argument 

arg1 and double arg2 and return pointer to a function or address of function

which has a two int type arguments and return an int */

pointer_to_add  ptr=add; //ptr is a pointer now to add function.

return  ptr;
} 

更简单的形式

pointer_to_add my_function(int arg1,double arg2)
{

 pointer_to_add ptr=add;

 return ptr;

 }

现在在您的主代码中,您可以使用返回的地址,例如:

 int main(void)
  {
    pointer_to_add P=my_function(25,3.5);
    printf("%i",p(22,33));
    return 0;
    } 

【讨论】:

    猜你喜欢
    • 2014-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 2019-05-09
    • 1970-01-01
    相关资源
    最近更新 更多