#include <stdio.h>
#include <string.h> #pragma warning(disable:4996) //闲言碎语都先不要讲了,直接上函数吧。字符串拼接函数 const char *myStrcat(const char *, const char *);
//myStrcat的回调函数:
const char *myback(const char *(const char*, const char *), const char, const char);
//const char *myback(const char *这里最好放一个函数名,要不不好理解(const char*, const char *), const char, const char); //正文:typedef typedef const char *(MYSTRCAT1)(const char *, const char *);
//这句话等价于,定义一个函数叫做:MYSTRCAT,要求这个函数的返回值是const char *,并且传入两个参数 都是 const char *.
typedef const char *(* MYSTRCAT2)(const char *, const char *);
//这句话等价于定义一个函数地址。一个指向【 返回值是const char *,拥有两个参数都是const char *的[函数]】的地址
//所以回调函数myback可以写成:
const char *myback1(MYSTRCAT1, const char *, const char *);
//以及
const char *myback2(MYSTRCAT2, const char *, const char *); int main(){
//用法一:
//char *myString = myStrcat("hello ", "world");
//printf(myString);
//free(myString); //用法二: //用法二 打开这是第一行:MYSTRCAT1 *myStrcat1 = &myStrcat;
//这个函数真的是写的我一脸懵逼。。。
//解释一下为什么:MYSTRCAT1是一个函数。myStrcat是一个返回了函数的const char * 的函数。
//所以定义一个MYSTRCAT1类型的函数myStrcat1的指针,要他取myStrcat函数的地址。 // 注解第一层:相当于:
//int i = 0;
//int *p = &i; /* 注解第二层:
//再复杂一点相当于:
{
int i;//等价于:const char *myStrcat(const char *, const char *);声明有这样一个变量
int main(){
int *p = &i;
//等价于:MYSTRCAT1 *myStrcat1 = &myStrcat;
}
i = 0;//定义
等价于:
const char *myStrcat(const char * str1, const char * str2){
if (str1 != NULL&&str2 != NULL){
char *p = malloc(strlen(str1) + strlen(str2) + 1);//+1 是为了\0 文件结尾
strcpy(p, str1);
strcat(p, str2);
return p;
}
}
}
*/
//用法二 打开这是第二行:char *p = myback1(myStrcat1, "hello", "world");
//用法二 打开这是第三行:printf(p);
//用法二 打开这是第四行:free(p); MYSTRCAT2 mystrcat2 = myStrcat;//因为在定义的时候 MYSTRCAT2 本身就是一个指向 myStrcat函数的地址
char *p = myback2(mystrcat2, "hello", "world");
printf(p);
free(p); getchar();
return ; } const char *myStrcat(const char * str1, const char * str2){
if (str1 != NULL&&str2 != NULL){
char *p = malloc(strlen(str1) + strlen(str2) + );//+1 是为了\0 文件结尾
strcpy(p, str1);
strcat(p, str2);
return p;
}
}
//存在正文时,不允许未知名的原型参数,原型参数包括:myStrcat,str1,str2
const char *myback(const char *myStrcat(const char *, const char *), const char *str1, const char *str2){
return myStrcat(str1, str2);
} //对应的函数实现:
const char *myback1(MYSTRCAT1 functionName, const char *str1, const char *str2){
//这里写的都一样我就蒙蔽了
return functionName(str1, str2);
}
const char *myback2(MYSTRCAT2 functionName, const char *str1, const char *str2){
//这里写的都一样我就蒙蔽了
return functionName(str1, str2);
}

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. JSON 格式的转换: 数组、字符串、List集合、DataTable,实体对象

    JSON验证工具:http://jsonlint.com/JSON简明教程:http://www.w3school.com.cn/json/Newtonsoft.Json类库下载:http://jso ...

  2. Java 时间转换问题总结

    这几天开发中遇到时间转换出错的问题,特总结如下:   ========================================================================= ...

  3. 【译】 AWK教程指南 附录C-AWK的内建函数

    C.1 字串函数 index( 原字串, 查找的子字串 ) 若原字串中含有欲寻找的子字串,则返回该子字串在原字串中第一次出现的位置,若未曾出现该子字串则返回0. 例如: $ awk 'BEGIN{ p ...

  4. 初识SQL注入

    什么是SQL注入(SQL Injection)? SQL注入是网站攻击途径之一,这里引用一下百度百科的解释:“所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串, ...

  5. wuzhicms短信API 实例调用

    1.接口调用 $sendsms = load_class('sms','sms'); echo $sendsms->send_sms('18911549611', '888888', 1); / ...

  6. wuzhicms 查看模板中的所有可用变量和值

    将代码放到模板中. {php print_r(get_defined_vars());} 页面显示如下: 这样看不清楚. 通过查看页面源文件的方式打开. 例如:chrome 浏览器打开方式,在页面空白 ...

  7. hadoop hdfs的java操作

    访问hdfs上的文件并写出到输出台 /** * 访问hdfs上的文件并写出到输出台 * @param args */ public static void main(String[] args) { ...

  8. 检测是否安装了 .NET Framework 3.5

    此脚本是为 Internet Explorer 设计的.    其他浏览器可能在 UserAgent 字符串中不包含 .NET CLR 信息. <HTML> <HEAD> &l ...

  9. Intra Refresh of H264 encoder

    https://en.wikipedia.org/wiki/X264 x264 is able to use Periodic Intra Refresh instead of keyframes, ...

  10. 获取最外层View

    获取最外层View activity.getWindow().getDecorView()