typedef的使用2——定义函数

时间:2023-03-09 01:17:46
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 ; } const char *myStrcat(const char * str1, const char * str2){
if (str1 != NULL&&str2 != NULL){
char *p = malloc(strlen(str1) + strlen(str2) + );//+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);
}