typedef的使用2——定义函数

本文介绍了一个使用C语言实现的字符串拼接函数,并通过类型定义来创建回调函数,展示了不同方式调用该函数的方法。文章深入解析了如何定义函数指针以及如何在实际代码中使用这些函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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);
}

 

转载于:https://www.cnblogs.com/letben/p/5243392.html

### C/C++ `typedef` 定义函数类型 #### 使用方法 在C/C++编程语言中,为了提高代码的可读性和简洁性,可以利用`typedef`关键字为复杂的类型定义别名。对于函数而言,这同样适用。通过`typedef`定义函数类型能够使后续的操作更加直观。 当涉及到函数指针时,直接声明可能会显得较为晦涩难懂。例如,要声明一个指向接受两个整数参数并返回一个整数值的函数的指针,可以直接写成: ```cpp int (*p)(int, int); ``` 但是这种方式不够直观。借助于`typedef`,可以让上述表达变得更加清晰易懂[^2]。 #### 示例 下面展示如何使用`typedef`来定义函数类型以及基于此创建函数指针的例子。 ##### 步骤一:定义函数类型 首先,定义一种新的类型表示特定签名的函数——即接收两个整型输入并输出一个整型结果的函数: ```cpp // 定义函数类型 'FuncType' 表示 (int, int)->int 的函数 typedef int FuncType(int, int); ``` 此处引入了新名字`FuncType`作为`(int, int)`到`int`映射关系的一种抽象描述方式[^1]。 ##### 步骤二:创建函数指针 有了之前定义好的`FuncType`之后,就可以很容易地创建相应的函数指针变量了: ```cpp // 创建一个名为 fp 的函数指针,它可以指向任何匹配 FuncType 签名的函数 FuncType* fp; ``` 此时,`fp`就是一个合法的函数指针对象,可用于存储满足条件的具体实现地址[^4]。 ##### 步骤三:关联具体函数 假设存在这样一个具体的加法运算函数`add()`: ```cpp // 实现一个简单的加法操作 int add(int a, int b){ return a + b; } ``` 那么现在可以把这个函数赋值给前面提到过的函数指针`fp`: ```cpp // 将 add() 函数绑定至 fp 上 fp = add; // 或者更紧凑的形式,在初始化的时候就指定目标函数 FuncType *fp = add; ``` 最后,便可通过间接调用来执行对应的功能逻辑: ```cpp // 调用被 fp 所指向的目标函数,并传入实参列表 printf("%d\n", fp(3, 4)); // 输出7 ``` 以上过程展示了完整的流程链路,从定义通用化的函数接口开始直到最终完成一次有效的回调请求[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值