typedef使用

1、利用typedef定义函数指针 

  代码简化,促进跨平台开发
  typedef行为有点类似#define 宏,用其实际类型替代同义字。
    不同点:typedef 在编译时被解释,因此让编译器来 应付超越预处理器能力的文本替换;
  用法一:
    typedef int (* func)(int, int);-----------这种用法一般用在给函数定义别名的时候;
    形式:typedef 返回值类型 (*函数别名)(参数列表)
    上面的例子定义func 是一个函数指针, 函数类型是:参数为两个int, 返回值为:int
  分析方法如下:
    先去掉typedef和别名,剩下的就是原变量的类型。
    如:int (*func)(int , int )
      char (*pFun)(int);  //定义了一个指针变量pFun,它是一个指向某种函数的指针,这种函数参数是一个int类型。
      //只有这一句我们还无法使用这个指针,因为我们还没对它进行赋值
      char glFun(int a){return ;}  //定义量一个函数glFun(),该函数正好是一个以int为参数返回char的函数,
       //我们从指针的层次上理解函数,函数的函数名实际上就是一个指针,函数名指向该函数的代码在内存中的首地址;

    int main()
    {
      pFun = glFun;
      (*pFun)(2);
      return 0;
    }

  用法二:
    typedef 给变量类型定义一个别名:
    typedef struct{
      int id;
      char name[10];
    }mystruct;
    这里把一个还未命名的结构体直接取了一个mystruct的别名。
    这样如果定义结构体的实例可以这样:
      mystruct tmp;

 1 #include <stdio.h>
 2 typedef int (*FP_CALC)(int, int);
 3 int  add(int a, int b)
 4 {
 5     return a + b;
 6 }
 7
 8 int sub(int a, int b)
 9 {
10     return a - b;
11 }
12
13 int mul(int a, int b)
14 {
15     return a * b;
16 }
17
18 int div(int a, int b)
19 {
20     return b?a/b:-1;
21 }
22
23 //定义一个函数,参数是op,返回值是一个函数指针,
24 //该函数指针类型:参数是2个int, 返回值是int
25 //该函数的作用是根据操作符返回对应函数的地址;
26 30 FP_CALC calc_func(char op)
27 {
28     switch (op)
29     {
30         case '+': return add;   //返回地址
31         case '-': return sub;
32         case '*': return mul;
33         case '/': return div;
34         default:
35                   return NULL;
36     }
37     return NULL;
38 }
39
40 //s_calc_func为函数,参数是op;
41 //返回值为一个拥有  两个int参数,返回类型为int的函数指针
42 int (*s_calc_func(char op))(int, int)
43 {
44     return calc_func(op);
45 }
46
47 //最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果
48 int calc(int a, int b, char op)
49 {
50     FP_CALC fp = calc_func(op); //根据预算得到各种运算的函数地址;
51         int (*sp)(int, int) = s_calc_func(op);  //用于测试;
52 //  ASSERT(fp = sp); //设置断言
53         if(fp) return fp(a, b); //根据上一步得到的函数的地址调用相应函数,并返回结果
54             else return -1;
55 }
56
57 int main()
58 {
59     int a = 100, b = 20;
60     printf("calc(%d, %d, %c) = %d\n", a, b, '+', calc(a, b, '+'));
61     printf("calc(%d, %d, %c) = %d\n", a, b, '-', calc(a, b, '-'));
62     printf("calc(%d, %d, %c) = %d\n", a, b, '*', calc(a, b, '*'));
63     printf("calc(%d, %d, %c) = %d\n", a, b, '/', calc(a, b, '/'));
64     return 0;
65 }

 

时间: 2024-09-21 22:30:24

typedef使用的相关文章

typedef struct-BMP位图的操作,怎么判断是否是个256色的位图

问题描述 BMP位图的操作,怎么判断是否是个256色的位图 typedef struct tagBITMAPINFOHEADER{ DWORD biSize; LONG biWidth; LONG biHeight; WORD biPlanes; WORD biBitCount; DWORD biCompression; DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; DWORD biClrUsed; DWORD bi

Java 理论与实践: 伪typedef反模式

将泛型添加到 Java 语言中增加了类型系统的复杂性,提高了许多变量和方法声明的冗长程度.因为没有提供 "typedef" 工具来定义类型的简短名称,所以有些开发人员转而把扩展当作 "穷人的 typedef",结果收到了良好的效果. 对于 Java 5.0 中新增的泛型工具,一个常见的抱怨就是,它使代码变得太冗长.原来用一行就够的变量声明不再存在了,与声明参数化类型有关的重复非常讨厌,特别是还没有良好地支持自动补足的 IDE.例如,如果想声明一个 Map,它的键是

C语言中的typedef详解

typedef声明,简称 typedef,为现有类型创建一个新的名字.比如人们常常使用 t ypedef来编写更美观和可读的代码.所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性. typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图.类型出现在所声明的变量名字中,位于 ''typedef''关键字右边.例如:typedef int size; 此声明定义了一个 int的同义字,名字为 size.注意 typede

C语言的typedef问题

1. 基本解释 typedef为C语言的关键字,作用是为一种数据类型定义一个新名字.这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等). 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明. 至于typedef有什么微妙之处,请你接着看下面对几个问题的具体阐述. 2. typedef & 结构的问题 当用下面的代码定义一个结构时,编译器报了一个错误,为什么呢?莫非C语言不允许在结构中包含指向它

使用typedef抑制劣质代码

摘要:Typedef 声明有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法.不管 怎样,使用 typedef 能为代码带来意想不到的好处,通过本文你可以学习用 typedef 避免 缺欠,从而使代码更健壮. typedef 声明,简称 typedef,为现有类型创建一个新的 名字.比如人们常常使用 typedef 来编写更美观和可读的代码.所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性 .本文下面将竭尽全力来揭示 typed

C语言typedef与复杂函数声明问题的深入解析

以下是对C语言中的typedef与复杂函数声明问题进行了详细的分析介绍,需要的朋友可以过来参考下   下面是三个变量的声明,我想使用typedef分别给它们定义一个别名,请问该如何做?>1:int *(*a[5])(int, char*); >2:void (*b[10]) (void (*)()); >3. doube(*)() (*pa)[9];答案与分析: 对复杂变量建立一个类型别名的方法很简单,你只要在传统的变量声明表达式里用类型名替代变量名,然后把关键字typedef加在该语句

c语言数据结构-typedef struct的运用

问题描述 typedef struct的运用 问题:struct LNode *s,*q;下面代码中的这条语句中的struct是不是可以去掉,如果不行那么struct的作用是?谢谢! typedef char ElemType; typedef struct LNode { ElemType data; struct LNode * next; }LNode,*LinkList; void InsertList(LinkList &L,ElemType x,int i) { int j=1; s

关于typedef之四种用途 和 两个陷进

typedef用来声明一个别名,typedef后面的语法,是一个声明.本来笔者以为这里不会产生什么误解的,但结果却出乎意料,产生误解的人 不在少数.罪魁祸首又是那些害人的教材.在这些教材中介绍typedef的时候通常会写出如下形式: typedef int PARA; 这种形式跟#define int PARA几乎一样,如前面几章所述,这些教材的宗旨是由浅入深,但实际做出来的行为却是以偏盖全.的确,这种形式在所有形式中是最简单的,但却没有对 typedef进一步解释,使得不少人用#define的

深入理解typedef

                                                          深入理解typedef   关于typedef的用法,网上已经有很多前辈总结过了,在这里我不想标新立异,代码阅历不一样,所理解的typedef的层次各有不同.这里,我想就我所理解的typedef用更加通俗易懂的方式写出来.     在开始之前,要始终牢记:   typedef的本质是取一个别名 先从简单的说起: typedef alias type型 这里,typedef后面有2个

gcc-#define T Connection_T typedef struct T *T;

问题描述 #define T Connection_T typedef struct T *T; #define T Connection_T typedef struct T *T;这在gcc下是可以编译通过的,但是我想问接下来T代表什么意思阿?是Connection_T还是什么?还是结构体指针? 解决方案 你用gcc什么版本编译的 我得到的是 Line 2: error: conflicting declaration 'typedef struct Connection_T* Connec