[初]小议typedef

2024-01-14 11:08
文章标签 typedef 小议

本文主要是介绍[初]小议typedef,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

typedef void (*ptr_fun)(int ,int);

 因为刚学C++,这种typedef 函数指针的用法令我有点困惑?

我对于上面的形式的唯一问题就是,这有什么用?

 

先简单介绍下typedef的用法:

typedef 顾名思意就是创建一个新的类型名(不是新类型!)

typedef unsigned int  U32;

typedef 旧名字  新名字(其中旧名字必须是一个已经存在的类型名)

所以你typedef blackPig pinkPig;编译器就不知道你想干吗了.

 

切入主题->typedef void (*ptr_fun)(int ,int);有什么用?(问题A)

现看下面这个小例子

//author:snail

//date:070404

#include <iostream>
#include <cstdio>

using namespace std;


//####################################################
void fun1(char* c,int&){
 cout << c << "/n";
}
void (*ptr_fun1)(char*,int&);
//typedef void (*ptr_fun1)(char *,int &);
ptr_fun1 fun2(ptr_fun1 ptr){return ptr;}    //ptr_fun1是什么?这里能做为类型吗?
//#####################################################


int main(int argc,char* argv[]){
 int i = 100;
 fun1("hello",i);
 ptr_fun1 = fun1;
 ptr_fun1("one more hello",i);

 system("pause");
 return 0;
}

编译时红色代码那里不能通过,错误原因是:

BS_function_1_070404.cpp:13: error: `ptr_fun1' does not name a type

这句话的意思,在这里ptr_fun1是一个变量名,而不是一个类型名,所以无法作为fun2函数声明中形参的类型名,那现在的问题是如果我们需要以这样的形式传入函数指针,我们应该怎么办?(问题B)

问题A和问题B很有趣,一个是另一个的答案,所以两个问题联系起来不难理解

要实现这样的形式,必须借助typedef 这个工具创建某一个能够具体函数指针的新类型

即typedef void (*ptr_fun1)(char *,int &);

这里的 void 和 (*ptr_fun1)(char*,int &)不是联系在一起的,前面的void是系统已经存在的类型,后面(*ptr_fun1)(char *,int &)指ptr_fun1是一个接受两个参数而且返回类型(匿名)等于'旧类型'void的一个函数指针类型

 

 

这可以理解为一个间接命名:

typedef A  B;  最常用的用法

[typedef A  B(C->B);] --> typedef A C; 创建函数指针类型的用法(B和C有联系,但B给匿名了,这里只创建了一个新类型名C);

 

 

使用了typedef以后的程序!

//author:snail

//date:070404

#include <iostream>
#include <cstdio>

using namespace std;


//####################################################
void fun1(char* c,int&){
 cout << c << "/n";
}

typedef void (*ptr_fun1)(char*,int&);
//typedef void (*ptr_fun1)(char *,int &);
ptr_fun1 fun2(ptr_fun1 ptr){return ptr;}     //#####################################################


int main(int argc,char* argv[]){
 int i = 100;
 fun1("hello",i);

ptr_fun1 = fun1//错误,这里ptr_fun1不再是一个变量名了,不能直接使用
 

ptr_fun1 ptr;

 ptr = fun1;
 ptr("one more hello",i);

fun2(ptr)("one more more hello!",i);//现在终于可以以这种形式调用函数指针了,这都是typedef的功劳

 system("pause");
 return 0;
}

 作者:snail
日期:07年4月4日
参考资料:<<C++程序语言设计特别版>>B.S

这篇关于[初]小议typedef的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/604940

相关文章

c语言:typedef + struct + 指针

c语言规范,定义结构体: typedef  struct ANSWER_HEADER { u8 u8Type; u8 u8Code; u32 u32TimeStamp; struct ANSWER_HEADER *pNext; }ANSWER_HEADER_T, *PANSWER_HEADER_T;   ANSWER_HEADER为结构名,这个名字主要是为了在结构体中包含自己为成

质量小议43 - 提效

解决问题就是提效,问题总是有的     解决了一个问题就会产生一个人或多个新的问题,提效总是持续的     办法总比问题多,只要愿意,提效总是不断     提效意味着什么?     提效:以更少的资源达成更好的结果     更好:更多的成查,更高质量的成果     提效最直观的表现是财务报表,投入少产出多     资源:自然资源 + 社会资源     笼统的说来就是 人、财、物,以及

小议C语言中的数组和指针

1.引言   在C语言中,数组和指针是其中非常重要又联系紧密的两种数据类型,同时也是重点难点集中的地方。在学习这些内容时,经常会碰到这样一些问题,例如:数组名是什么,就是首地址吗?数组如何访问元素?数组为什么不能进行越界检查?数组表示法和指针表示法有何关系,谁更好?正确理解这些问题,对指针和数组的使用是非常有帮助的。 2.数组名的含义   在大多数的教材中都对数组名作出这样的解释:数组是一组数据

【C/C++】typedef用法

typedef用法讲解,时隔半年,再看typedef。 🎁typedef可以简化结构体关键字  #include<iostream>using namespace std;struct Person{char name[64];int age; };void test01(){struct Person p = { "张三",18 };//不用typedef,stru

【C++】定义类型别名的三种方式及其优缺点:typedef,#define 和 using

引言 类型别名是一种给已存在的类型创建一个新名字的方式。这个新的名字(别名)和原类型在语义上是完全相等的,可以在任何原类型可以使用的地方使用。类型别名并不创建一个新的类型,只是为了提高代码的可读性和可维护性。 在C++中,可以使用typedef,#define或者using来定义别名。每种方式都有其优点和缺点,但是在现代C++(C++11及以后的版本)中,推荐使用using。 三种方式

C++typedef的详细用法

转自知乎的一段解释: 作者:知乎用户 链接:https://www.zhihu.com/question/29798061/answer/144423125 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。   不太想谈#define, 在题主的例子的这种用法里, 它就是个文本替换工具, 预处理器完成的, 无脑替换, 跟word里的replace一模一样, 不关

【c++】11.重写、覆盖、using、typedef

重写、覆盖、using、typedef 注意,重写和覆盖并不是一个意思。 重写: 重写是虚函数在子类中重新定义,使用override,override也可以不写,加上override是规范,语义更清晰明白它是重写虚函数。 覆盖: 覆盖 是 子类定义 同名函数 覆盖 掉父类同名函数。 父类如果定义某非虚函数func1(int,int),子类定义了函数func1(double),那么子类不

关于oc中出现的typedef的用法/定义函数指针

typedef int (^calculateBlock)(int a,int b); 这里面typedef的作用只是给 calculateBlock取了一个 别名,说明以后可以直接使用。 calculateBlock类似于*所以可以有类似的用法,以后可以直接使用calculateBlock来定义方法。例: - (int)calculateWithNumber1:(int)number1

C++结构体(struct/typedef)

定义结构体需要使用关键字struct修饰 struct MyStruct1{ int a;int c;}; (重要)下面声明了4个东西,分别是 1.结构体User 2.User指针类型的指针p1 3.User指针类型的指针p3 4.给User起了一个别名叫p2 // 注意p1p3是指针,p2不是typedef struct User{char name[6];int age;}

C语言中的typedef(包含与#define的区别)

今天在做一个编程练习的时候,想要使用链表,使用链表嘛就像使用以下typedef来定义以下链表节点,忽然感觉自己把typedef这个关键字给忘掉了,所以写这篇文章回忆以下N多年前用过的typedef 注:这部分内容中主要的内容来自百度百科typedef,还有一部分是自己的理解 简介: typedef这个是关键字是用来为复杂的结构体或者类型定义简单的别名的关键字,注意加黑的部分,我觉得这个是理解