typedef的使用3——使用经过typedef定义的函数构成的函数数组
#include <stdio.h>
#include <string.h>//不加还能跑,加上反而跑不了了。。。笑哭
#pragma warning(disable:4996)//要这句跟上面那个包含放在一起。否则会有一个警告阻止编译。 //字符串拷贝函数:
const char * myStrcat(const char *,const char *); typedef const char * MYSTRCAT1(const char *,const char *);
//这里是定义了一个MYSTRCAT1这种类型的对象,本身是一个函数 typedef const char * (*MYSTRCAT2)(const char *, const char *);
//定义了一个指向这种函数的地址 //回调函数: const char * myback(const char * (const char *, const char *), const char *, const char *); const char * myback1(MYSTRCAT1, const char *, const char *); const char * myback2(MYSTRCAT2, const char *, const char *); int main(){
//char *p = myStrcat("hello", " world");
//printf(p);
//free(p); /*
char *pf = myStrcat;
char *p1 = myback(pf, "hello", " world");
printf(p1);
free(p1);
*/
/*
MYSTRCAT1 *function = &myStrcat;
char *p2 = myback1(function, "hello", " world");
printf(p2);
free(p2);
*/ /*
MYSTRCAT2 function2 = myStrcat;
char *p3 = myback2(function2, "hello", " world");
printf(p3);
free(p3);
*/ /*
MYSTRCAT1 * function1[10];
function1[0] = &myStrcat;
char *p4 = myback1(function1[0], "hello", " world");
printf(p4);
free(p4);
*/
MYSTRCAT2 function2[];
function2[] = myStrcat;
char *p5 = myback2(function2[], "hello", " world");
printf(p5);
free(p5); getchar();
return ; } const char * myStrcat(const char *str1, const char * str2){
if (str1 != NULL&&str2 != NULL){
char *p = malloc(strlen(str1) + strlen(str2) + );
strcpy(p, str1);
strcat(p, str2);
return p;
}
} const char * myback(const char * func(const char *, const char *), const char * str1, const char * str2){
return func(str1, str2);
}
const char * myback1(MYSTRCAT1 func, const char *str1, const char *str2){
return func(str1, str2);
}
const char * myback2(MYSTRCAT2 func, const char *str1, const char *str2){
return func(str1, str2);
}
什么时候 用typedef 什么时候 使用 #define?
typedef是一种高级数据特性,它能使某一类型创建自己的名字
1、与#define不同,typedef仅限于数据类型,而不是能是表达式或具体的值
2、typedef是编译器处理的,而不是预编译指令
3、typedef比#define更灵活
直接看typedef好像没什么用处,使用BYTE定义一个unsigned char。使用typedef可以增加程序的可移植性。
应用场合:
1、在程序当中如果是定义一个可读的常量,适合用#define
2、如果定义的是一个具体的数据类型,那么typedef更加适合。
3、如果是定义一个函数指针,那么基本就用typedef.
typedef的使用3——使用经过typedef定义的函数构成的函数数组的更多相关文章
- typedef 类型重命名 和 #define 宏定义(1)
http://www.blogjava.net/jasmine214--love/archive/2010/11/29/339307.html 在现实生活中,信息的概念可能是长度,数量和面积等.在C语 ...
- typedef void(*Fun) (void)是什么意思 函数指针(回调函数) 和函数对象总结
https://blog.csdn.net/FreeApe/article/details/49124043 bool (*pf)(const string &,const string &a ...
- typedef 返回类型(*Function)(参数表) ——typedef函数指针
//首先看一下函数指针怎么用 #include <iostream> using namespace std; //定义一个函数指针pFUN,它指向一个返回类型为char,有一个整型的参数 ...
- C语言利用va_list、va_start、va_end、va_arg宏定义可变參数的函数
在定义可变參数的函数之前,先来理解一下函数參数的传递原理: 1.函数參数是以栈这样的数据结构来存取的,在函数參数列表中,从右至左依次入栈. 2.參数的内存存放格式:參数的内存地址存放在内存的堆栈段中, ...
- c++中的函数重载、函数重写、函数重定义
目录 一.函数重载 二.函数重写 三.函数重定义 为了更加深刻的理解 函数重载.重写.重定义,我们可以带着如下这两个问题去思考: 1.子类中是否可以定义父类中的同名成员?为什么? 可以,因为子类与父类 ...
- 将对象的所有属性名放到一个数组中 || 获得对象的所有属性名 || return;不具有原子性 || 怎样自己制作异常|| 判断对象有没有某个属性 || 当传递的参数比需要的参数少的时候,没有的值会被赋予undefined || 获得函数实际传递的参数 || 怎么用函数处理一个对象 || 用一个名字空间定义一个模块所有的函数 || 给一个对象添加方法
获得对象的所有属性名 || 将对象o的所有属性名放到数组中 var o = {x:1,y:2,z:3}; var arr = []; var i = 0; for(arr[i++] in o){};/ ...
- [js]变量声明、函数声明、函数定义式、形参之间的执行顺序
一.当函数声明和函数定义式(变量赋值)同名时 function ledi(){ alert('ledi1'); }; ledi(); var ledi = function (){ alert('le ...
- Swift超详细的基础语法-结构体,结构体构造器,定义成员方法, 值类型, 扩充函数
知识点 基本概念 结构体的基本使用 结构体构造器(构造函数/构造方法) 结构体扩充函数(方法), 又称成员方法 结构体是值类型 1. 基本概念 1.1 概念介绍 结构体(struct)是由一系列具有相 ...
- C++中,如何定义和使用指向成员函数的指针
/*** 定义指向成员函数的指针变量的形式 : 成员函数返回类型 (类名∷*指针变量名)(参数列表)* 成员函数指针变量值的形式 : &类名∷成员函数名;* 成员函数指针变量使用形式 : (对 ...
随机推荐
- 树莓pi快速ssh【校园网】
校园网是NAT后的,没有显示器,我把路由器的DHCP服务关了,这样的情况下怎么ssh到树莓pi? 把树莓pi 连到路由器上(已经关闭DHCP),手机安装FING https://play.google ...
- js基础第七天
短信发送验证倒计时案例(常用) 关闭定时器clearInterval this 指向的是 事件的调用者 ,或者是函数的使用者. button 不可以用 disabled 不可用的意思 意思是变成灰色不 ...
- Storm入门
Storm框架入门 1 Topology构成 和同样是计算框架的Mapreduce相比,Mapreduce集群上运行的是Job,而Storm集群上运行的是Topology.但是Job在运行结束之后会自 ...
- 【转载】计算机视觉(CV)前沿国际国内期刊与会议
计算机视觉(CV)前沿国际国内期刊与会议这里的期刊大部分都可以通过上面的专家们的主页间接找到1.国际会议 2.国际期刊 3.国内期刊 4.神经网络 5.CV 6.数字图象 7.教育资源,大学 8.常见 ...
- iso定制封装
http://xiaoli110.blog.51cto.com/1724/1617541
- setResult()设置无效,onActivityResult没有被调用
情况1 呃,被坑了几个小时,后来发现,在调用setResult的时候,requestCode随便传了个Activity的RESULT_OK,而这个常量的值是-1,导致onActivityResult没 ...
- 【C语言】-循环结构-for语句
for语句: for (表达式1;表达式2;表达式3) { 循环语句 } 表达式1 给循环变量赋初值 表达式2 为循环条件 表达式3 用来修改循环变量的值,称为循环步长. for语句的执行流程: 例: ...
- C# 产生随机密码
using System.Web.Security var rawPassword = System.Web.Security.Membership.GeneratePassword(10,1) re ...
- AVR抗干扰能力一般
在485通信中,为了方便测试,在485 芯片前端加下了插测好测试量,可是用TTL直接通信, 但是,在实际的PCB测试中,9600 的波特率下不小心用手碰了P5插针,会现大量的数量错误, 后来在Tx和R ...
- C#将对象转换成JSON字符串,Newtonsoft.Json (JSON.NET)
官方API说明文档 http://www.newtonsoft.com/json/help/html/N_Newtonsoft_Json.htm http://www.newtonsoft.com/ ...