typedef函数,typedef 用法
typedef函数,typedef 用法详细介绍
本文目录一览: typedef用法
为typedef int size即可。
使用typedef为现有类型创建别名,定义易于记忆的类型名,typedef 还可以掩饰复合类型,如指针和数组。数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。
在编程中使用typedef目的有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。符合范围规则,使用typedef定义的变量类型其作用范围限制在所定义的函数或者文件内(取决于此变量定义的位置),而宏定义则没有这种特性。
扩展资料:
typedef的相关内容:
1、标准调用约定的函数在它们返回到调用者之前,都会从堆栈中移除掉参数,为Pascal的标准约定。
2、在C/C++中,调用约定是调用者负责清理堆栈,而不是被调用函数;为强制函数使用C/C++调用约定,可使用__cdecl。另外,可变参数函数也使用C/C++调用约定。
3、Windows操作系统采用了标准调用约定(Pascal约定),因为其可减小代码的体积。这点对早期的Windows来说非常重要,因为那时它运行在只有640KB内存的电脑上。
参考资料来源:百度百科-typedef
c语言中typedef是什么函数?有什么作用?请举个简单例子说明
类型定义,作用是将一个量用另外一个量代替,比如typedef long float lf
则以后可以用lf表示long float
不是函数,是关键字,对已有类型起别名用的。
typedef int INT;
INT a ;与int a;的效果一样。
typedef声明,简称typedef,为现有类型创建一个新的名字,或称为类型别名,在结构体定义,还有一些数组等地方都大量的用到。
它有助于创建平台无关类型,甚至能隐藏复杂和难以理解的语法 。使用typedef可编写出更加美观和可读的代码。所谓美观,意指typedef能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性以及未来的可维护性。
使用typedef为现有类型创建同义字,定义易于记忆的类型名
typedef使用最多的地方是创建易于记忆的类型名,用它来归档程序员的意图。类型出现在所声明的变量名字中,位于“typedef”关键字右边。例如:
typedef int size;
此声明定义了一个int的同义字,名字为size。注意typedef并不创建新的类型。它仅仅为现有类型添加一个同义字。你可以在任何需要int的上下文中使用size
C++怎么理解typedef int (((fp()))) (int);
因为“()”的优先级高于“*”,所以
typedef int (*(*(fp()))) (int);
可以化简为
typedef int(**fp()) (int);
看int(**fp()) (int); //fp是个函数,它返回个这样的玩意: int(**)(int) ,这是个指针,假设这个指针叫A,A又指向一个函数的指针B,B指向一个函数,该函数有一个int参数,返回一个int
fp就是返回一个A类型指针的函数
那么前面加个typedef则fp就被定义成一种类型了:fp就是一种能返回A类型指针的函数,A类型就是 int(**)(int)
给你个具体例子:
#include
using namespace std;
int f(int a) { return 2*a;} //定义一个int(int)函数
typedef int(*(*(pf()))) (int);
pf k; //用上面的typedef类型声明函数k
int main()
{
cout<<(**k())(1234); //k返回一个函数的**, 则*k就是个函数的* ,**k就是个函数了
return 0;
}
int(**k())(int) //定义函数k
{
int(*pfi)(int) = f; //定义一个指针pfi,指向函数f
int(**ppf)(int)=&pfi; //定义一个指针ppf 指向pfi
return ppf; //返回这个指针
}
结果输出2468
typedef int (*(*(fp()))) (int);可以化简为:typedef int(**fp()) (int)。
看int(**fp()) (int); //fp是个函数,它返回个这样的玩意: int(**)(int) ,这是个指针,假设这个指针叫A,A又指向一个函数的指针B,B指向一个函数,该函数有一个int参数,返回一个int。
发展历程
世界上第一种计算机高级语言是诞生于1954年的FORTRAN语言。之后出现了多种计算机高级语言。1970年,AT&T的Bell实验室的D.Ritchie和K.Thompson共同发明了C语言。
研制C语言的初衷是用它编写UNIX系统程序,因此,它实际上是UNIX的“副产品”。它充分结合了汇编语言和高级语言的优点,高效而灵活,又容易移植。
1971年,瑞士联邦技术学院N.Wirth教授发明了Pascal语言。Pascal语言语法严谨,层次分明,程序易写,具有很强的可读性,是第一个结构化的编程语言。
20世纪70年代中期,Bjarne Stroustrup在剑桥大学计算机中心工作。他使用过Simula和ALGOL,接触过C。他对Simula的类体系感受颇深,对ALGOL的结构也很有研究,深知运行效率的意义。既要编程简单、正确可靠,又要运行高效、可移植,是Bjarne Stroustrup的初衷。
以C为背景,以Simula思想为基础,正好符合他的设想。1979年,Bjame Sgoustrup到了Bell实验室,开始从事将C改良为带类的C(C with classes)的工作。1983年该语言被正式命名为C++。
自从C++被发明以来,它经历了3次主要的修订,每一次修订都为C++增加了新的特征并作了一些修改。
第一次修订是在1985年,第二次修订是在1990年,而第三次修订发生在c++的标准化过程中。在20世纪90年代早期,人们开始为C++建立一个标准,并成立了一个ANSI和ISO(International Standards Organization)国际标准化组织的联合标准化委员会。
该委员会在1994年1月25曰提出了第一个标准化草案。在这个草案中,委员会在保持Stroustrup最初定义的所有特征的同时,还增加了一些新的特征。
以上内容参考:百度百科-C++
c语言如何使用typedef定义一个函数指针类型,该指针类型指向一个不需要参数,并且返回值为int
typedef int(*PointNameToFunc)(void);
请多在网路上搜寻, 已经有很多参考资料.
typedef int (*funptr)(void);
typedef int (*FUN_TYPE) (void);
C语言中,使用typedef 定义一个函数指针类型的书写格式如下:
typedef 返回值类型 (*函数指针类型名称)(参数列表);
为方便理解,下面在手机上使用易历知食软件内部的微C程序设计来编程,演示其定义方式,并写个测试函数,再通过函数指针来调用测试函数,在手机上的代码如下图(图截取自手机):
运行结果如下图:
typedef int (funcptr)(); 什么意思
定义一个函数指针类型。
比如你有三个函数:
void
hello(void)
{
printf("你好!");
}
void
bye(void)
{
printf("再见!");
}
void
ok(void)
{
printf("好的!");
}
typdef
void
(*funcptr)(void);
这样就构造了一个通用的函数
你用的时候可以这样:
void
speak(int
id)
{
funcptr
words[3]
=
{&hello,
&bye,
&ok};
funcptr
fun
=
words[id];
(*fun)();
}
这样的话,如果speak(0)就会显示“你好!”
speak(1)就会显示“再见!”
speak(2)就会显示“好的!”
用于处理参数和返回值的形式都一样,但是功能不确定的一组函数,可以使用函数指针。
比如算术运算符,加、减、乘、除,都可以用typedef
int
(*calc)(int,int)代表,等等
提问者的意思是很有意义的。按常规,typedef是为后面跟着的标识符起一个别名跟在右边,而现在写法不同,有疑问很有道理。但我想,计算机语言的语法就是些规定,只好记住了。而且就这个具体问题而言,写成typedef
int(*)()
funcptr可以解释成typedef
int
(*funcptr)(),但也可以解释成typedef
int
(*)(funcptr)啊;当然可以规定这种写法只能作typedef
int
(*funcptr)()解释,那还不如就规定写成typedef
int
(*funcptr)()方便。这都是当初的开发者的意图,后人只好顺承了。
typedef
int
(*funcptr)();
这个的意思是:定义一个返回值为int,不带参数的函数指针,
就是说funcptr
是
int
(*)()型的指针
funcptr
table[10];
定义一个数组,这个数组是funcptr类型的。就是说这个数组内的内容是一个指针,这个指针指向一个返回值为int,不带参数的函数
typedef int32_t (set_hs_?t)(void); 这样定义的是什么函数
typedef是重新定义数据类型,就是说将int32_t类型重新定义成一个指针类型set_hs_t,这个指针指向一个参数为空的函数。
typedef 将类型int32_t (* )(void);定义了一个别名 set_hs_t,也就是说set_hs_t是一个指针类型,该类型指针可以指向 返回值为int32_t的无参数函数。比如如果有函数原型
int32_t fun (void);
那么就可以如下定义一个函数指针p使其指向fun函数
set_hs_t p;
p = fun;
数据结构,构造三元组,为什么typedef放在main外面?typedef具体的作用?以及头文件的写法?
编译器 是这样编译的:从一个文件的第一行开始逐行往下编译,先出现的定义语句先认识,这里typedef目的是将int型重新定义成ElemType,并且在多个函数都有用到,如果你只放在main函数里面,很显然别的函数就不能识别这个ElemType类型。
作用之一:typedef可用来给数据类型关键词起个别名,用这别名代替关键词可以起到原来相同的作用,与关键词同义,原有的int、double等和自定义的struct等类型都可以用到
如typedef int ElemType
则ElemType就是int
ElemType m;就是int m;
typedef int ElemType写在程序的开头前面几行,在main()外,也不在任何一个函数的函数头、函数体中,则是【全局声明】,
表明以后出现在所有函数的函数头、函数体中的ElemType都是指int,把ElemType当做int
像int i;这样的,只写在函数内的,为【局部声明】
作用二(与作用一类似,有小小的差异,所以我把它分开来看):给指针类型起别名,隐藏性定义指针(不是新定义,而是完全等同替换,换汤不换药,本质是一样的,多包了一层马甲,这样就把数据类型隐藏起来)
typedef ElemType *Trp;//指向整型的指针类型Trp
含义是Trp=ElemType *=int *
Trp t;就是int * t;
以上两种情况,都要看到“typedef .....;”才知道说的是什么类型
malloc 是个函数,用来(动态)申请新的内存空间
原型为
void *malloc(int size);(void*含义是返回的指针值指向的类型(返回值是指针)不定,类型size指的是字节数,即用户申请分配的内存空间的大小)
可换为(int *)malloc(int size)等
sizeof(ElemType)→“整型数据占的字节数、整数所占的内存大小”
if(!(t=.....))
!(t=.....) (括号内的表达式t=......的值有0或者非0(布尔值),即t=....为假或为真(”真“表示仍可以有返回的指针,”假“表示不能返回指针了,内存已满,开辟不了可以放指针的新空间,自然就没有返回了)
,对应的整个表达式!(t=.....)的值“非0或者0,为真或为假”,关系到下方的程序是否被执行,!(t=.....)为真就表示可执行)(if((t=.....))的含义是如果内存还有剩余,内存还可用,就申请新内存,返回指针给t, 加!后是相反的含义)
typedef int(int)(int)
以这种形式来说:typedef int(*P)(int )
typedef这个关键字给 函数指针P 起了个别名,然后你就可以用这个P 来定义或者转换其他指针的类型。比如:
存在一个这样的函数:
int add(int x)
{
return x+1;
}
P f=add; //用P类型 定义一个f, f就可以接收此种函数形式的函数名,
f(5); //然后可以用f调用这个add()函数。
你的这个事不是写错了啊。。你编译过吗??应该是多了一个int吧??
其实可以这样看,将其省略的参数都加上,应该是这样的:
typedef int(*P)(int x)
P是一个指向函数的指针类型,其所指向的函数具有一个int类型的参数,并且函数返回一个int类型的数据。
typedef 用法
typedef用法如下。
1、隐藏笨拙且难以理解的语法,使用typedef为现有类型创建别名,定义易于记忆的类型名。typedef
还可以掩饰复合类型,如指针和数组。
2、typedef的最简单使用,给已知数据类型long起个新名字,例如叫byte_4。
3、typedef与结构结合使用,这语句实际上完成两个操作:
1)
定义一个新的结构类型。
2)
typedef为这个新的结构起了一个名字,叫MyStruct。
4、typedef和define的问题,typedef要比define要好,特别是在有指针的场合。
5、define宏定义有一个特别的长处:可以使用ifdef
,ifndef等来进行逻辑判断,还可以使用undef来取消定义。
参考资料来源:搜狗百科— typedef
简单的说,就是起了一个别名,举个例子:
typedef int integer;
把int自定义成 integer后
int a;和integer a;是等价的,但对于结构体和联合体来说,自定义类型,可以减少输入量!
自定义类型还有方便移植的好处!
如果CPU由16位机移到32位机,你只需要把声明的头文件typedef int integer;改成typedef long integer;就行了,不必去修改程序内容
typedef常见用法
1.常规变量类型定义
例如:typedef
unsigned
char
uchar
描述:uchar等价于unsigned
char类型定义
uchar
c声明等于unsigned
char
c声明
2.数组类型定义
例如:
typedef
int
array[2];
描述:
array等价于
int
[2]定义;
array
a声明等价于int
a[2]声明
扩展:
typedef
int
array[M][N];
描述:
array等价于
int
[M][N]定义;
array
a声明等价于int
a[M][N]声明
3.指针类型定义
例如:
typedef
int
*pointer;
描述:
pointer等价于
int
*定义;pointer
p声明等价于int
*a声明
例如:
typedef
int
*pointer[M];
描述:
pointer等价于
int
*[M]定义
pointer
p声明等价于int
*a[M]声明明
4.函数地址说明
描述:C把函数名字当做函数的首地址来对待,我们可以使用最简单的方法得到函数地址
例如:
函数:int
func(void);
unsigned
long
funcAddr=(unsigned
long)func,
funcAddr的值是func函数的首地址
5.函数声明
例如:
typedef
int
func(void);
func等价于
int
(void)类型函数
描述1:
func
f声明等价于
int
f(void)声明,用于文件的函数声明
描述2:
func
*pf声明等价于
int
(*pf)(void)声明,用于函数指针的生命,见下一条
6.函数指针
例如:
typedef
int
(*func)(void)
描述:
func等价于int
(*)(void)类型
func
pf等价于int
(*pf)(void)声明,pf是一个函数指针变量
7.识别typedef的方法:
a).第一步。使用已知的类型定义替代typdef后面的名称,直到只剩下一个名字不识别为正确
如typedef
u32
(*func)(u8);
从上面的定义中找到
typedef
__u32
u32;typedef
__u8
u8
继续找到
typedef
unsigned
int
__u32;typedef
unsigned
char
__u8;
替代位置名称
typedef
unsigned
int
(*func)(void);
现在只有func属于未知。
b).第二步.未知名字为定义类型,类型为取出名称和typedef的所有部分,如上为
func等价于unsigned
unsigned
int
(*)(unsigned
char);
c).第三部.定义一个变量时,变量类型等价于把变量替代未知名字的位置所得到的类型
func
f等价于unsigned
unsigned
int
(*f)(unsigned
char)
不是用bintnode来代替node
是用bintnode来代替
struct
node
struct
node是一个结构体的类型名
就像是int是个类型名一样
如果你不用typedef的话
以后你定义结构体变量就要像这样定义struct
node
变量名
和int
变量名
一样
很麻烦
如果用了typedef的话
只要用(上面你的例子)
bintnode
来代替
struct
node
就变成了
bintnode
变量名
这样看起来很清楚了
不是用bintnode来代替node
是用bintnode来代替
struct
node
struct
node是一个结构体的类型名
就像是int是个类型名一样
如果你不用typedef的话
以后你定义结构体变量就要像这样定义struct
node
变量名
和int
变量名
一样
很麻烦
如果用了typedef的话
只要用(上面你的例子)
bintnode
来代替
struct
node
就变成了
bintnode
变量名
这样看起来很清楚了
typedef用法如下。
1、隐藏笨拙且难以理解的语法,使用typedef为现有类型创建别名,定义易于记忆的类型名。typedef
还可以掩饰复合类型,如指针和数组。
2、typedef的最简单使用,给已知数据类型long起个新名字,例如叫byte_4。
3、typedef与结构结合使用,这语句实际上完成两个操作:
1)
定义一个新的结构类型。
2)
typedef为这个新的结构起了一个名字,叫MyStruct。
4、typedef和define的问题,typedef要比define要好,特别是在有指针的场合。
5、define宏定义有一个特别的长处:可以使用ifdef
,ifndef等来进行逻辑判断,还可以使用undef来取消定义。
参考资料来源:搜狗百科— typedef
C语言定义函数指针时的typedef怎么理解
可以,在计算机编程语言中用来为复杂的声明定义简单的别名,与宏定义有些差异。它本身是一种存储类的关键字,与auto、extern、mutable、static、register等关键字不能出现在同一个表达式中。
可以不用,如果你愿意一直写影响阅读的代码。
你可以比较两种方式的编写难度和阅读难度:注释和没注释的部分
typedef int zhengxing;//要定义别名的类型为int,定义的别名为zhengxing
typedef void (*intFunc)(int);//要定义的类型是void (*)(int),即参数一个int,什么也不返回的函数指针,定义的别名是intFunc。
typedef int (*ADD2_FUN) (int, int);typedef int (*ADD3_FUN) (int, int, int);static int add2(int a, int b){ return a+b;}static int add3(int a, int b, int c){ return a+b+c;}static const void *getFunPtr(const char *name){ if(name) { if(strcmp(name, "add2") == 0) { return (void *)&add2; } else if(strcmp(name, "add3") == 0) { return (void *)&add3; } } return NULL;}int main(){ /*int (*add3) (int, int, int) = (int (*) (int, int, int))getFunPtr("add3"); cout << (*add3)(1, 2, 3) << endl;*/ ADD3_FUN add3 = (ADD3_FUN)getFunPtr("add3"); cout << (*add3)(1, 2, 3) << endl; return 0;}