typedef int (*funp_t)(int) 和typedef int fun_t(int)的比较

转载 2018年04月15日 20:19:16

相似点

  • 都使用typedef将由基础数据类型构成的复杂组合类型赋给一个简单的名字;
  • 都遵循C的传统——由typedef定义的类型以“_t“结尾;
  • 二者都能起到减少代码字符输入量的作用;
  • “一定程度上”增加代码的可读性(此观点不具有绝对正确性,仁者见仁)
  • 在以下情况调用函数使用方式相同:
void second(fun_t first);
void second(fun_t *first);
void second(funp_t first);
  • 1
  • 2
  • 3

针对这三种方式,在second函数内,既可以用first(14)调用也可以用(*first)(14)调用。

区别

  • typedef int (*funp_t)(int)定义一个函数指针类型 funp_t; 而typedef int (fun_t)(int)定义一个函数类型 fun_t;
funp_t p; //定义一个类型是int (*)(int) 的变量p,即:函数指针p
fun_t p; //声明一个整型参数和一个整型返回值的函数p,即:int p(int);
fun_t *p; //定义一个指向函数int ()(int)的指针变量p和funp_t p;等价
  • 1
  • 2
  • 3
  • funp_t直接可用于函数参数和返回值;而fun_t可以直接用于函数参数,但是不能直接用于函数返回值,此时要结合*才可以用作返回值;
funp_t setfun(funp_t nf); //right 设置一个新的函数指针nf,返回旧的函数指针
fun_t getfun();//error,函数不能返回函数
fun_t * getfun(); //right
void setfun(fun_t nf); //right 等价于 funp_t nf
void setfun(fun_t *nf); //right 等价于 funp_t nf
  • 1
  • 2
  • 3
  • 4
  • 5

C99中“明确“指出函数不能返回函数(ISO/IEC 9899:1999 P141的第137号脚标注);函数内部不能定义函数;以及函数能够转换成对应的函数指针(ISO/IEC 9899:1999 P143 EXAMPLE2),反之不行!

  • funp_t用的较多,而fun_t用的较少!

对于fun_t作用除了结合’*’声明或定义变量外。它还有一个偶尔有用的用途:函数内部(外部)声明函数! 
虽然C99指出没有static限制的函数都具有隐式的extern属性,但是某些编译器做不到:依旧是先声明(定义)再使用;因此如果某个函数在未声明或定义之前调用了,那么你必须在调用之前显式的声明! 
比如下面代码片

void second(void)//first定义在后,且无前置声明
{
    first(14);//某些编译器会编译不过或给出警告
}

int first(int n)
{
    printf("%d\n", n);
    return 7;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

(1)可以在调用之前声明来解决

fun_t first;//函数声明
void second(void)
{
    fun_t first; //函数声明
    first(14);
}
//...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

可以同时声明多次,但是定义只能一次。上面代码中声明两次,只是为了示例,用户自选一种即可。这里主要为了体现函数内部也可以函数声明的方式! 
(2)以传递参数形式解决

void second(fun_t first)
{
    first(14);
    (*first)(14); //right
}
//...
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

typedef int (* func)(int ,int )

先看一下例子: #include "iostream" using namespace std; int add(int a,int b){ return (a+b); } ...
  • baoendemao
  • baoendemao
  • 2014-11-17 15:10:46
  • 2389

typedef int (*f)(int x) 的含义

定义了一个自定义数据类型f,f类型的变量有以下定义: 它是一个指向函数的指针,所指向的函数有一个int类型的参数(int x的作用),返回值类型也是int类型(typedef后面的int的作用) 追...
  • NOHACKCCC
  • NOHACKCCC
  • 2013-11-26 11:25:36
  • 2070

typedef int a[10];怎么解释?

问:typedef int a[10]; a b[10]; 为什么分配400个字节的空间? int a[10];为什么分配了40个字节的空间? 问题:应该怎么解释typedef的这种行为呢?而如...
  • finish_dream
  • finish_dream
  • 2016-07-05 08:36:03
  • 1254

关于typedef int (*pFunc)(int, int)

typedef int (*pFunc)(int, int) 申明一个指针变量pFunc, 指向int  (*)(int, int) 从而可以 pFunc func; int add(i...
  • u011068464
  • u011068464
  • 2013-08-15 22:32:25
  • 792

typedef int (*pfunc)(int ,int);是什么?

typedef S32             (*IntCallback)(SimObject *obj, S32 argc, const char *argv[]);这是我看到的原型,之前有typ...
  • zipper9527
  • zipper9527
  • 2009-09-14 10:57:00
  • 4368

typedef int(_stdcall* topenPort)(char *port, int baundrate);

typedef int(_stdcall* topenPort)(char *port, int baundrate);      定义一个名叫topenPort的函数指针,int是返回值类型;...
  • kucoffee12
  • kucoffee12
  • 2017-07-26 14:41:01
  • 332

C语言之typedef int (*funcptr)()

问:“typedef int (*funcptr)();”是什么意思?     答:它定义了一个类型funcptr,表示指向返回值为int型,参数未指明的函数指针,它可以被用来声明一个或多个函数指针...
  • zhangzhi123456789
  • zhangzhi123456789
  • 2015-10-14 23:28:22
  • 1475

typedef int* PINT与#define PINT int*的区别

这是一个很多人都不会用错但是却不甚了解的知识点,(正因为不会用错才不去了解)。 比较下面程序中,const修饰对象分别是什么:#define PINT_DEF int* typedef int* P...
  • Apollon_krj
  • Apollon_krj
  • 2017-03-09 17:48:54
  • 611

关于typedef int (*ADDPROC)(int a, int b)

在DLL学习中出现了一个不太好懂的语句: typedef int (*ADDPROC)(int a, int b)
  • xinpengdd
  • xinpengdd
  • 2014-10-09 09:26:20
  • 446

Instability(typedef pair<LL,int> P;)

Instability Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) To...
  • kangyan__
  • kangyan__
  • 2017-08-23 18:58:08
  • 222
收藏助手
不良信息举报
您举报文章:typedef int (*funp_t)(int) 和typedef int fun_t(int)的比较
举报原因:
原因补充:

(最多只允许输入30个字)