typedef定义的函数指针

合集下载

C语言typedef用法总结

C语言typedef用法总结

C语言typedef用法总结黄海涛,2012-3-11C语言中的typedef可以让人感觉很清新,但也可以让人感觉神秘。

当你一层层剥开它的时候,神秘的面纱终会摘下……让我们一起来探究其中的秘密吧!一、概述1、类型定义符typedefC语言提供了一个称为typedef的工具,它允许你为各种数据类型定义新的名字。

定义形式:typedef 原类型名新类型名;它的格式与变量声明完全一样,只是把typedef这个关键字放在声明的前面,但typedef并不创建变量,而是为指定类型引入一个新的名字。

2、实质其实质是:为现有类型取个新名字,它并没有引入新的类型。

typedef是一种声明形式,它为一种类型引入新的名字,而不是产生新的类型,也不会为变量分配空间。

3、作用时机在某些方面,typedef类似于宏文本替换,但typedef是类型定义符,在编译时会有相应类型的检查。

typedef是由编译器解释的。

▲typedef与#define的区别A.#define后面没有分号,而typedef后面有分号;B.#define不是关键字,而typedef是关键字;C.宏定义中宏名紧跟着#define,而typedef中的类型名并不紧接其后;D.可以用其他类型说明符对宏名进行扩展,但对typedef定义的类型名却不行;例如:E.在连续几个变量声明中,typedef定义的类型名可以保证声明中所有的变量均为同一种类型,而#define定义的宏名则无法保证。

4、使用原因1)表达方式更简洁,简化编程;2)使程序参数化,提高程序的可移植性;3)为程序提供更好的说明性,可以引入一个易记且意义明确的新名字,提升可维护性。

5、缺点允许一些看上去混乱的语法,可以把几个声明放在一个声明中。

如:二、使用typedef声明定义时的限制1、2、3、存储类关键字:auto、extern、register、static与typedef但在存储类说明符中,typedef是个例外,它不会真正影响对象的存储特性。

C++typedef用法详解

C++typedef用法详解

C++typedef⽤法详解转⾃,经过整理typedef的语法描述在现实⽣活中,信息的概念可能是长度,数量和⾯积等。

在C语⾔中,信息被抽象为int、float和 double等基本数据类型。

从基本数据类型名称上,不能够看出其所代表的物理属性,并且int、float和double为系统关键字,不可以修改。

为了解决⽤户⾃定义数据类型名称的需求,C 语⾔中引⼊类型重定义语句typedef,可以为数据类型定义新的类型名称,从⽽丰富数据类型所包含的属性信息。

typedef的语法描述typedef 类型名称类型标识符;typedef为系统保留字,“类型名称”为已知数据类型名称,包括基本数据类型和⽤户⾃定义数据类型,“类型标识符”为新的类型名称。

例如: typedef double LENGTH;typedef unsigned int COUNT;定义新的类型名称之后,可像基本数据类型那样定义变量。

例如:typedef unsigned int COUNT;unsigned int b;COUNT c;typedef 的主要应⽤形式typedef 的主要应⽤有如下的⼏种形式:1) 为基本数据类型定义新的类型名。

2) 为⾃定义数据类型(结构体、公⽤体和枚举类型)定义简洁的类型名称。

3) 为数组定义简洁的类型名称。

4) 为指针定义简洁的名称。

为基本数据类型定义新的类型名typedef unsigned int COUNT;typedef double AREA;此种应⽤的主要⽬的,⾸先是丰富数据类型中包含的属性信息,其次是为了系统移植的需要,稍后详细描述。

为⾃定义数据类型(结构体、公⽤体和枚举类型)定义简洁的类型名称。

例如:struct Point{double x;double y;double z;};struct Point oPoint1={100,100,0};struct Point oPoint2;其中结构体struct Point为新的数据类型,在定义变量的时候均要有保留字struct,⽽不能像int和double那样直接使⽤Point来定义变量。

C++的#define,typedef,extern的使用

C++的#define,typedef,extern的使用
{ static double money=20000000; int num; public: int get(){return num;}; double getMoney(){reuturn money;}
} double *p=&NJUPT::money; double (*p)()=&NJUPT::getMoney():
Ⅳ:类成员的指针
类成员和一般的外部变量相互比较,不同就是它所在的域不同,这个域很重要,它决 定了该变量可以使用的范围。那么一个指针如果要指向类的成员函数或者成员变量,那么除 了要表达它的返回类型、参数列表或者类型之外,那么还要说明它所指向的变量(或者函数)
的域,为了说明该域我们要使用类域限定: class njust
Visual Stadio C/C++
——#define,typeof,指针使用方法说明
对于一般非专业的 C/C++编程人员,一般会对#define,typeof,指针等定义模糊,不知道 怎么应用这些语句。结合本人的编程经验和看过的一些资料,下面将在 Visual Stadio 2012(本 人系统是 64 位的,内存位移偏量是 4)编程环境下结合一些实例对这些语句进行讲解,主 要还是对常用于微处理器的语句进行讲解。希望能对大家的学习和应用有一些帮助。如果你 发现其中有什么不对的说法可以发邮件给我(554252585@)。
int *ptr; ptr = MALLOC ( 5, int ); 将这宏展开以后的结果:ptr = (int *) malloc ( (5) * sizeof(int) ); 这个例子是宏定义的经典应用之一,完成了函数不能完成的功能,但是宏定义也不 能滥用,通常,如果相同的代码需要出现在程序的几个地方,更好的方法是把它实 现为一个函数。 (2)下面总结宏和函数的不同之处,这段总结摘自《C 和指针》一书。

typedef定义函数类型

typedef定义函数类型

typedef定义函数类型本⽂转载于:最近在看posix实时信号时,遇到⼀处函数是如此定义的:[cpp]1. typedef void sigfunc_rt(int, siginfo_t *, void *);在我常规理解⾥,⼀般定义⼀个函数类型都是这样定义的:[cpp]1. typedef void (*sighandler_t)(int);2. sighandler_t signal(int signum, sighandler_t handler);其实对于函数,typedef有两类⾃定义类型:⾸先我们要先明⽩⼀个概念,函数名是不是指针?也就是说⼀个函数名可不可以代表⼀个地址?以及什么是函数类型?经过查找,函数名就是⼀个指针,但是意义是不⼀样的,如同于数组a[],a和&a其实都是⼀样的。

当调⽤⼀个函数时,我们都是直接⽤函数名调⽤,或者说通过指针调⽤。

函数类型,在我理解,就是定义了⼀个函数返回值类型以及参数类型。

那么:1.tpyedef⾃定义函数指针类型:[cpp]1. #include <stdio.h>2. typedef int (*fp_t)(char c);3.4. int f0(char c) { printf("f0, c = %c\n", c); return 0;}5. int f1(char c) { printf("f1, c = %c\n", c); return 1;}6.7. int main()8. {9. int ret;10. fp_t fp;11. fp = f0;12. ret = fp('a');13. fp = f1;14. ret = fp('x');15. return 0;16. }运⾏结果:f0, c = af1, c = x2.typedef⾃定义函数类型:[cpp]1. #include <stdio.h>2. typedef int fp_t(char c);3.4. int f0(char c) { printf("f0, c = %c\n", c); return 0;}5. int f1(char c) { printf("f1, c = %c\n", c); return 1;}6.7. int main()8. {9. int ret;10. fp_t* fp;11. fp = f0;12. ret = fp('a');13. fp = f1;14. ret = fp('x');15. return 0;16. }运⾏结果:f0, c = af1, c = x。

qt中typedef的用法

qt中typedef的用法

在C++编程中,typedef是一种用于定义类型别名的关键字。

在Qt框架中,typedef也常被用于简化复杂数据类型的声明和使用。

以下是在Qt中使用typedef的一些常见场景:1.定义新的数据类型:2.cpp复制代码typedef QList<int> IntList;这样,你就可以使用IntList作为QList<int>的别名,而不是每次都写QList<int>。

2. 定义函数指针类型:cpp复制代码typedef void(*SignalType)(int);在Qt中,信号(signals)和槽(slots)机制经常使用这种函数指针类型。

上面的代码定义了一个名为SignalType的函数指针类型,该函数接受一个int参数并返回void。

3. 定义枚举类型:cpp复制代码typedef QFlags<Qt::AlignmentFlag> AlignmentFlags;Qt的QFlags模板类用于表示位集,它可以方便地处理枚举值的组合。

上面的代码定义了一个新的类型AlignmentFlags,它是Qt::AlignmentFlag枚举类型的位集别名。

4. 简化复杂类型声明:对于复杂的模板类型或指针类型,typedef可以帮助你简化声明。

cpp复制代码typedef QSharedPointer<QObject> QObjectPointer;这样,你就可以使用QObjectPointer代替原始的复杂类型。

5. 定义数组类型:cpp复制代码typedef QList<int> IntList;typedef IntList::ConstIterator IntListConstIterator;上面的代码定义了一个常量迭代器类型IntListConstIterator,它是IntList的常量迭代器类型别名。

6. 定义函数指针或成员函数指针类型:这些用法与常规C++中的用法相似,但也可以在Qt中使用。

typedefine 函数指针

typedefine 函数指针

typedefine 函数指针函数指针是C语言中的一个重要概念,它可以让程序在运行时动态地选择调用某个函数。

在C语言中,函数指针的定义使用了typedef 关键字,可以将函数指针类型起一个新的名字,从而提高代码的可读性和可维护性。

函数指针的定义形式如下:typedef 返回值类型 (*函数指针名字)(参数列表);其中,返回值类型是函数的返回值类型,函数指针名字是我们为函数指针起的新名字,参数列表是函数的参数列表。

通过typedef关键字,我们可以将函数指针类型起一个新的名字,使得代码更加易读。

函数指针可以作为函数的参数或者返回值,这在C语言中非常常见。

通过函数指针,我们可以动态地选择调用不同的函数,从而实现程序的灵活性和可扩展性。

在C语言中,函数指针可以用于回调函数的实现。

回调函数是指一个函数作为参数传递给另一个函数,在特定的事件发生时被调用。

通过函数指针,我们可以实现事件和相应函数的解耦,使得程序更加灵活和可扩展。

函数指针还可以用于实现函数的动态加载。

在某些情况下,我们需要在运行时根据条件选择调用不同的函数,这时可以使用函数指针。

通过函数指针,我们可以根据条件选择加载不同的函数,从而实现程序的动态性和可配置性。

函数指针的使用需要注意一些细节。

首先,函数指针的类型必须和被调用函数的类型匹配,否则会导致编译错误。

其次,函数指针可以指向任意类型的函数,包括有返回值和无返回值的函数,参数个数和类型也可以不同。

在使用函数指针时,我们可以通过函数指针调用函数,也可以通过函数指针获取函数的地址,从而实现函数的传递和调用。

函数指针的调用方式与普通函数调用相同,只是需要通过函数指针来调用。

函数指针是C语言中的一个重要概念,它可以提高程序的灵活性和可扩展性。

通过函数指针,我们可以动态地选择调用不同的函数,实现回调函数和函数的动态加载等功能。

函数指针的使用需要注意一些细节,但是只要掌握了基本的用法,就可以灵活地应用于实际的程序中。

typedef函数指针的定义和使用方法说明

typedef函数指针的定义和使用方法说明

2、 typedef 用法
2.1 用法一:给函数定义别名 typedef (int) (*FunName) (int, int) 这种用法一般在给函数定义别名的时候用到,上面的例子中 FunName 是一个函数指 针,函数本身带两个 int 参数,返回一个 int。 分析上述定义时,可以去掉 typedef 和别名,剩下的部分就是原变量的类型。如: typedef (int) (*FunName) (int, int) 去掉 typedef 和别名后剩下: (int) (*) (int, int) 说明 FunName 是一个函数指针。 2.2 用法二:给数据类型定义别名 typedef struct { int VaribleA; int VaribleB; }NewTypeName; 上述例子中,通过 typedef 定义了一个新的类型别名 NewTypedef。在定义别名后,
Calculation GetFunctionAddr(char option) //获取对应运算的函数地址 { switch(option) { case 1: return(AddCalc); case 2: return(SubCalc); default: return(NULL); } } main() { int Varible1 = 1; int Varible2 = 2; //定义函数指针,存放函数地址 Calculation fp = GetFunctionAddr(1);
可以通过以下的步骤优化: //定义每一个 case 对应的处理函数 void HandleCase1(void) { 功能 1; } ….. void HandleCase100(void) { 功能 100; } typedef (void)(*HandleCaseFcn)(void); HandleCaseFcn FcnName[]

c++的typedef的用法

c++的typedef的用法

C++中typedef关键字的用法本文介绍了C++中typedef的用法和作用。

typedef是一种用来创建类型别名的关键字,它可以为一个已有的数据类型定义一个新的名称,以方便程序员使用。

typedef有以下几种用途:定义类型别名,提高代码的可读性和一致性。

定义与平台无关的数据类型,实现跨平台的编程。

定义复杂的声明,简化代码的编写和理解。

定义函数指针,方便函数作为参数或返回值传递。

一、typedef的基本语法typedef的语法如下:typedef type new_type_name;其中,type是已有的数据类型,new_type_name是我们为该类型定义的新名称。

例如:typedef int INT; //定义INT为int类型的别名typedef char* PSTR; //定义PSTR为char*类型的别名使用typedef定义的新类型名可以像原类型名一样使用,例如:INT a = 10; //相当于int a = 10;PSTR s = "Hello"; //相当于char* s = "Hello";注意,typedef并不会创建新的数据类型,只是为已有的数据类型起一个新名字。

因此,使用typedef定义的新类型名和原类型名是完全等价的,可以互相赋值或比较。

例如:int b = a; //合法PSTR t = s; //合法if (a == b) //合法if (s == t) //合法二、typedef的用途2.1 定义类型别名使用typedef为一个已有的数据类型定义一个新名称,可以提高代码的可读性和一致性。

例如,在C语言中,经常需要使用指针来操作字符串或数组。

如果直接使用char或int等类型来声明指针变量,可能会出现以下问题:代码不够直观和清晰,容易出错或混淆。

例如:char* p1, p2; //p1是指针变量,p2是字符变量char *p1, *p2; //p1和p2都是指针变量代码不够一致和规范,容易造成风格不统一或误解。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

变量 Foo_t 的类型为 struct { ... // } ;
=> "typedef struct { ... // } Foo_t "中 Foo_t 是"struct { ... // }"的一个 typedef-name。 这里 struct {...//}是一个无"标志名称(tag name)"的结构体声明。
[例 1]
typedef double MYDOUBLE; 分析: 去掉 typedef ,得到正常变量声明=> double MYDOUBLE; 变量 MYDOUBLE 的类型为 double; => "typedef double MYDOUBLE"中 MYDOUBLE 是类型 double 的一个 typedef-name。 MYDOUBLE d; <=> d 是一个 double 类型的变量 [例 2]
再谈 typedef(重点为函数指针)
有种很方便的写法。
typedef int *p; p pointer; 这时直接把 pointer 带入原式中,取代 p 然后去掉 typedef,得到的结果就是 int * pointer; 哈哈,这样直接替换就很直观多了。
C 语言语法简单,但内涵却博大精深;如果在学习时只是止步于表面,那么往往后期 会遇到很多困难。typedef 是 C 语言中一个很好用的工具,大量存在于已有代码中,特别值 得一提的是:C++标准库实现中更是对 typedef 有着大量的使用。但很多初学者对其的理解 仅局限于:typedef 用来定义一个已有类型的"别名(alias)"。正是因为有了这样的理解,才有 了后来初学者在 typedef int myint 和 typedef myint int 之间的犹豫不决。很多国内大学的 C 语言课之授课老师也都是如是说的,或者老师讲的不够透彻,导致学生们都是如是理解的。 我这里想结合 C 语言标准文档以及一些代码实例,也说说 typedef。
#include "iostream"
using namespace std;
int add(int a,int b){ return (a+b); }
typedef int (* func)(int ,int ) ;
void main(){ func f = add; int n = f(1,2); cout << n << endl; }
typedef int* Func(int); 分析: 去掉 typedef ,得到正常变量声明=> int* Func(int); 变量 Func 的类型为一个函数标识符,该函数返回值类型为 int*,参数类型为 int;
=> "typedef int* Func(int)"中 Func 是函数类型(函数返回值类型为 int*,参数类型为 int) 的一个 typedef-name。
参照这段描述,并拿 typedef int *p 作为例子来理解:在一个声明中,如果有存储 类说明符 typedef 的修饰,标识符 p 将被定义为了一个 typedef name,这个 typedef name 表示(denotes)一个类型,什么类型呢?就是 int *p 这个声明(declarator)中标识符 (indentifier)p 的类型(int*)。
Func *fptr; <=> fptr 是一个 pointer to function with one int parameter, returning a pointer to int
Func f; 这样的声明意义就不大了。 [例 4]
typedef int (*PFunc)(int); 分析: 去掉 typedef ,得到正常变量声明=> int (*PFunc)(int); 变量 PFunc 的类型为一个函数指针,指向的返回值类型为 int,参数类型为 int 的函数 原型; => "typedef int (*PFunc)(int)"中 PFunc 是函数指针类型(该指针类型指向返回值类型为 int,参数类型为 int 的函数)的一个 typedef-name。 PFunc fptr; <=> fptr 是一个 pointer to function with one int parameter, returning int
[例 5]
typedef int A[5]; 分析: 去掉 typedef ,得到正常变量声明 => int A[5];
变量 A 的类型为一个含有 5 个元素的整型数组; => "typedef int A[5]"中 A 是含有 5 个元素的数组类型的一个 typedef-name。 A a = {3, 4, 5, 7, 8}; A b = { 3, 4, 5, 7, 8, 9}; /* 会给出 Warning: excess elements in array initializer */ [例 6] typedef int (*A)[5]; (注意与 typedef int* A[5]; 区分) 分析: 去掉 typedef ,得到正常变量声明 => int (*A)[5]; 变量 A 的类型为 pointer to an array with 5 int elements; => "typedef int (*A)[5]"中 A 是"pointer to an array with 5 int elements"的一个 typedef-name。 int c[5] = {3, 4, 5, 7, 8}; A a = &c; printf("%d\n", (*a)[0]); /* output: 3 */ 如果这样赋值: int c[6] = {3, 4, 5, 7, 8, 9}; A a = &c; /* 会有 Warning: initialization from incompatible pointer type */ [例 7] typedef struct _Foo_t Foo_t; 分析: 去掉 typedef ,得到正常变量声明 => struct _Foo_t Foo_t; 变量 Foo_t 的类型为 struct _Foo_t; => "typedef struct _Foo_t Foo_t"中 Foo_t 是"struct _Foo_t"的一个 typedef-name。 [例 8] typedef struct { ... // } Foo_t; 分析: 去掉 typedef ,得到正常变量声明 => struct { ... // } Foo_t;
typedef double *Dp; 分析: 去掉 typedef ,得到正常变量声明=> double *Dp; 变量 Dp 的类型为 double*,即 pointer to double; => "typedef double *Dp"中 Dp 是类型 double*的一个 typedef-name。 Dp dptr; <=> dptr 是一个 pointer to double 的变量 [例 3]
为了巩固上面的理解,我们再来看看"C 语言参考手册(C: A Reference Manual)"中的说 法:任何 declarator(如 typedef int *p)中的 indentifier(如 p)定义为 typedef-name, 其(指 代 p)表示的类型是 declarator 为正常变量声明(指代 int *p)的那个标识符(指代 p)的类型 (int*)。有些绕嘴,不过有例子支撑:
int *p; 这样的代码是 C 语言中最最基础的一个语句了,大家都知道这个语句声明了一个变量 p,其类型是指向整型的指针(pointer to int);如果在这个声明的前面加上一个 typedef 后, 整个语义(semantics)又会是如何改变的呢?
typedef int *p; 我们先来看看 C99 标准中关于 typedef 是如何诠释的?C99 标准中这样一小段精辟的 描述:"In a declaration whose storage-class specifier is typedef, each declarator defines an identifier to be a typedef name that denotes the type specified for the identifier in the way described in xx"。
再对一下两个声明:
int *p;
typedef int *p;
是不是有点"茅舍顿开"的感觉,int *p 中, p 是一个变量,其类型为 pointer to int;在 int *p 前面增加一个 typedef 后,p 变为一个 typedef-name,这个 typedef-name 所表示的类型 就是 int *p 声明式中 p 的类型(int*)。说句白话,typedef 让 p 去除了普通变量的身份,摇身 一变,变成了 p 的类型的一个 typedef-name 了。
相关文档
最新文档