typedef的使用2——定义函数

#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 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;
    }
}
//存在正文时,不允许未知名的原型参数,原型参数包括: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);
}

 

posted on 2016-03-04 20:48  木鸟飞  阅读(1357)  评论(0编辑  收藏  举报

导航