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[3];
    function2[2] = myStrcat;
    char *p5 = myback2(function2[2], "hello", " world");
    printf(p5);
    free(p5);




    getchar();
    return 0;




}

const char * myStrcat(const char *str1, const char * str2){
    if (str1 != NULL&&str2 != NULL){
        char *p = malloc(strlen(str1) + strlen(str2) + 1);
        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.

 

 

原文地址:https://www.cnblogs.com/letben/p/5243405.html