zoukankan      html  css  js  c++  java
  • 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.

     

     

  • 相关阅读:
    convert image to base64 and post to RESTful wcf
    在android webview实现截屏的手动tounchmove裁剪图片
    How to use jquery ajax and android request security RESTful WCF
    using swfUpload in asp.net mvc
    using HttpClient and sending json data to RESTful server in adroind
    ODP.NET数据访问
    android image watermark
    解决国内不能访问github的问题
    idapro权威指南第二版阅读笔记第九章 交叉引用和绘图功能
    idapro权威指南第二版阅读笔记第二章 逆向和反汇编工具
  • 原文地址:https://www.cnblogs.com/letben/p/5243405.html
Copyright © 2011-2022 走看看