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++中,如何定义和使用指向成员函数的指针
/*** 定义指向成员函数的指针变量的形式 : 成员函数返回类型 (类名∷*指针变量名)(参数列表)* 成员函数指针变量值的形式 : &类名∷成员函数名;* 成员函数指针变量使用形式 : (对 ...
随机推荐
- mina2
远程通信 Mina2 学习笔记 作者:李少华 邮箱:xiaosanshaoli@126.com QQ:305409913 2010-12-23 初稿 引言... 1 一. Mina ...
- e2e 自动化集成测试 环境搭建 Node.js Selenium WebDriverIO Mocha Node-Inspector
Node.js已经出来了许多年载,至今才开始接触.周未在家闲来无事,一时心血来潮,Google了大量的文章,经过实验,终于可以把整个环境给搭起来, 废话不多话,请看步骤. 特别注意, 本文章是针对Wi ...
- VTL说明文档
关于这个指南 这个指南是针对Velocity模版语言(VTL)的说明.更多其它的信息,请参考Velocity用户指南(http://velocity.apache.org/engine/release ...
- vs2015无法解析外部符号__imp__fprintf
使用vs2015编译ffmpeg的一个小项时,出现了__imp__fprintf和__imp____iob_func 的错误,google了一下,有的人 建议下载SDL源码重新编译一下,当然这个方案非 ...
- C/C++:拷贝构造函数
拷贝构造函数是一种特殊的构造函数,因为它也是用来构造对象的.它具有构造函数的所有特性.拷贝构造函数的作用是用一个已经存在的对象去初始化另一个对象,这两个对象的类类型应该是一样的.定义拷贝构造函数的形式 ...
- NIOP1995 石子合并(区间DP)
状态转移方程在代码中标出 本题注意是圆形,所以之前要预先处理一下s数组.处理之后总长度为2*n-1.第一个合并的起点有n个,所以总的方案数是n 注释在代码中标出 http://www.rqnoj.cn ...
- C# 结构体保存自定义文件 实例部分代码(转)
http://www.cnblogs.com/jxsoft/archive/2011/08/26/2154705.html
- 教程-Delphi各版本与工具下载地址
1.Delphi 7.0 下载地址:http://www.skycn.com/soft/2121.html 注册码:(正在用的没有问题)V8S3-KM82KQ-XN8JQK-EPS33EA-GZK汉化 ...
- 如何获得网页上的swf视频教程文件?
网上有很多免费的视频教程,但有的视频教程这能在线观看,无法离线下在,如何获得网页上的swf视频教程文件呢? 我问以"我要自学网"的视频教程为例进行讲解.这是一个我要自学网的PS视频 ...
- 射频识别技术漫谈(5)——防冲突【worldsing 笔记】
正常情况下读写器某一时刻只能对磁场中的一张射频卡进行读写操作.但是当多张卡片同时进入读写器的射频场时,读写器怎么办呢?读写器需要选出唯一的一张卡片进行读写操作,这就是防冲突. 防冲突机制是非接触式智能 ...