1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. #pragma warning(disable:4996)
  5.  
  6. //闲言碎语都先不要讲了,直接上函数吧。字符串拼接函数
  7.  
  8. const char *myStrcat(const char *, const char *);
  9. //myStrcat的回调函数:
  10. const char *myback(const char *(const char*, const char *), const char, const char);
  11. //const char *myback(const char *这里最好放一个函数名,要不不好理解(const char*, const char *), const char, const char);
  12.  
  13. //正文:typedef
  14.  
  15. typedef const char *(MYSTRCAT1)(const char *, const char *);
  16. //这句话等价于,定义一个函数叫做:MYSTRCAT,要求这个函数的返回值是const char *,并且传入两个参数 都是 const char *.
  17. typedef const char *(* MYSTRCAT2)(const char *, const char *);
  18. //这句话等价于定义一个函数地址。一个指向【 返回值是const char *,拥有两个参数都是const char *的[函数]】的地址
  19. //所以回调函数myback可以写成:
  20. const char *myback1(MYSTRCAT1, const char *, const char *);
  21. //以及
  22. const char *myback2(MYSTRCAT2, const char *, const char *);
  23.  
  24. int main(){
  25. //用法一:
  26. //char *myString = myStrcat("hello ", "world");
  27. //printf(myString);
  28. //free(myString);
  29.  
  30. //用法二:
  31.  
  32. //用法二 打开这是第一行:MYSTRCAT1 *myStrcat1 = &myStrcat;
  33. //这个函数真的是写的我一脸懵逼。。。
  34. //解释一下为什么:MYSTRCAT1是一个函数。myStrcat是一个返回了函数的const char * 的函数。
  35. //所以定义一个MYSTRCAT1类型的函数myStrcat1的指针,要他取myStrcat函数的地址。
  36.  
  37. // 注解第一层:相当于:
  38. //int i = 0;
  39. //int *p = &i;
  40.  
  41. /* 注解第二层:
  42. //再复杂一点相当于:
  43. {
  44. int i;//等价于:const char *myStrcat(const char *, const char *);声明有这样一个变量
  45. int main(){
  46. int *p = &i;
  47. //等价于:MYSTRCAT1 *myStrcat1 = &myStrcat;
  48. }
  49. i = 0;//定义
  50. 等价于:
  51. const char *myStrcat(const char * str1, const char * str2){
  52. if (str1 != NULL&&str2 != NULL){
  53. char *p = malloc(strlen(str1) + strlen(str2) + 1);//+1 是为了\0 文件结尾
  54. strcpy(p, str1);
  55. strcat(p, str2);
  56. return p;
  57. }
  58. }
  59. }
  60. */
  61. //用法二 打开这是第二行:char *p = myback1(myStrcat1, "hello", "world");
  62. //用法二 打开这是第三行:printf(p);
  63. //用法二 打开这是第四行:free(p);
  64.  
  65. MYSTRCAT2 mystrcat2 = myStrcat;//因为在定义的时候 MYSTRCAT2 本身就是一个指向 myStrcat函数的地址
  66. char *p = myback2(mystrcat2, "hello", "world");
  67. printf(p);
  68. free(p);
  69.  
  70. getchar();
  71. return ;
  72.  
  73. }
  74.  
  75. const char *myStrcat(const char * str1, const char * str2){
  76. if (str1 != NULL&&str2 != NULL){
  77. char *p = malloc(strlen(str1) + strlen(str2) + );//+1 是为了\0 文件结尾
  78. strcpy(p, str1);
  79. strcat(p, str2);
  80. return p;
  81. }
  82. }
  83. //存在正文时,不允许未知名的原型参数,原型参数包括:myStrcat,str1,str2
  84. const char *myback(const char *myStrcat(const char *, const char *), const char *str1, const char *str2){
  85. return myStrcat(str1, str2);
  86. }
  87.  
  88. //对应的函数实现:
  89. const char *myback1(MYSTRCAT1 functionName, const char *str1, const char *str2){
  90. //这里写的都一样我就蒙蔽了
  91. return functionName(str1, str2);
  92. }
  93. const char *myback2(MYSTRCAT2 functionName, const char *str1, const char *str2){
  94. //这里写的都一样我就蒙蔽了
  95. return functionName(str1, str2);
  96. }

typedef的使用2——定义函数的更多相关文章

  1. c语言定义函数指针和typedef简写

    二种方法来定义函数指针 #include<stdio.h> #include<stdlib.h> #include<Windows.h> int add(int a ...

  2. typedef struct与struct定义结构体

    今天在定义结构体的时候发现typedef struct与struct定义结构体有一些不同之处: 结构也是一种数据类型, 能够使用结构变量, 因此,  象其他 类型的变量一样, 在使用结构变量时要先对其 ...

  3. Entity Framework 6 Recipes 2nd Edition(11-1)译 -> 从“模型定义”函数返回一个标量值

    第11章函数 函数提供了一个有力代码复用机制, 并且让你的代码保持简洁和易懂. 它们同样也是EF运行时能利用的数据库层代码.函数有几类: Rowset Functions, 聚合函数, Ranking ...

  4. Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 用”模型定义”函数过滤实体集

    11-2. 用”模型定义”函数过滤实体集 问题 想要创建一个”模型定义”函数来过滤一个实体集 解决方案 假设我们已有一个客户(Customer)和票据Invoice)模型,如Figure 11-2所示 ...

  5. Entity Framework 6 Recipes 2nd Edition(11-2)译 -> 为一个”模型定义”函数返回一个计算列

    11-3. 为一个”模型定义”函数返回一个计算列 问题 想从”模型定义”函数里返回一个计算列 解决方案 假设我们有一个员工(Employee)实体,属性有: FirstName, LastName,和 ...

  6. Entity Framework 6 Recipes 2nd Edition(11-4)译 -> 在”模型定义”函数里调用另一个”模型定义”函数

    11-4.在”模型定义”函数里调用另一个”模型定义”函数 问题 想要用一个”模型定义”函数去实现另一个”模型定义”函数 解决方案 假设我们已有一个公司合伙人关系连同它们的结构模型,如Figure 11 ...

  7. Entity Framework 6 Recipes 2nd Edition(11-5)译 -> 从”模型定义”函数返回一个匿名类型

    11-5. 从”模型定义”函数返回一个匿名类型 问题 想创建一个返回一个匿名类型的”模型定义”函数 解决方案 假设已有游客(Visitor) 预订(reservation)房间(hotel ) 的模型 ...

  8. Entity Framework 6 Recipes 2nd Edition(11-6)译 -> 从一个”模型定义”函数里返回一个复杂类型

    11-6.从一个”模型定义”函数里返回一个复杂类型 问题 想要从一个”模型定义”函数返回一个复杂类型 解决方案 假设我们有一个病人(patient)和他们访客(visit)的模型,如 Figure 1 ...

  9. Javascript学习笔记:3种定义函数的方式

    ①使用函数声明语法定义函数 function sum(num1,num2){ return num1+num2; } ②使用函数表达式定义函数 var sum=function(num1,num2){ ...

随机推荐

  1. 【转】ubuntu 编码 UTF-8 GBK GB18030

    添加编码支持 sudo locale-gen zh_CN.GBK sudo locale-gen zh_CN.GB2312 sudo locale-gen zh_CN.GB18030 2.更新一下lo ...

  2. 为枚举类型添加说明 zt

    enum Orientation { [DescriptionAttribute("东")] East, [DescriptionAttribute("南")] ...

  3. js实现收缩菜单效果

    废话不多说,直接上代码: 有注释 <head> <title></title> <style type="text/css"> di ...

  4. Magento 处理方法

    1.在模板中添加图片: <div id="header-image" class="skip-image"> <img src="& ...

  5. 关于Aggregate 的一点用法

    比如 我们要 将数组或者对象中的某列或某属性 的值取出,然后 用 逗号隔开. 1.通常我们可能会用for 或foreach 来循环,然后将取出的值并添加至StringBuilder 2.用Aggreg ...

  6. 请求码(requestCode)与结果码(resultCode)解析

    Android apk开发中经常需要在活动(Activity)之间穿梭,并实现活动之间的数据传递.为了启动一个新的活动并得到该活动的返回数据,需调用方法startActivityForResult() ...

  7. 对String的一点了解

    /** * @param args */ public static void main(String[] args) { String str1 = "welcome"; Str ...

  8. Esper系列(十三)Splitting and Duplicating Streams

    功能:将同一个事件流分发到其它的事件流中. 格式: 1  ; i < events.length; i++) {   78              EventBean event = even ...

  9. Ngrok,一款可以帮助你展示网站和联网开发的工具

      使用Ngrok的目的就是为了可以让别人通过网络访问到自己本机上的项目 下面是一个简单的使用教程,详细的查看官网英文文档. 第一步: 登录官网:https://ngrok.com/   注册或者登录 ...

  10. MySQL命令使用手记

    1.登陆          >mysql -u root -p,root没密码按回车. 2.创建数据库  >create database XXX; 3.创建用户     >inse ...