=
语言的进化需要n多年,尤其是it已经成熟了,积累下来的代码量大而后续替换的动力不足。
因此,新型的书写规范且设计良好的语言,替换掉历史,需要更长时间。
新生事物的成本总是最低的。
正确的声明方式为:
typedef void(*)() variable;
但是c标准的创建者没有这样做,不知道为什么,而选择了这样的声明:
typedef void(*variable)();
C编译器非常清楚,这就是在声明一个void(*)() 类型的函数指针variable。
=
本文希望解决以下问题:
1、typedef 的基本概念
2、函数指针的基本概念
3、typedef void(*Func)(void)的由来
4、typedef void(*Func)(void)的用途
#define与typedef的区别
跟typedef有个很类似的关键字时#define,两者其实是有区别的,这里就不详细说,只做简单阐述。
typedef语句是在编译过程中被解析的,而#define是在编译之前的预处理过程中被解析的。#define所进行的只是对自定义别名的简单替换,而typedef则要灵活得多。总的来说,typedef可以做到#define所能做的所有事情,而且可以做得更好,但是两者是不一样的,详细区别请自行百度。
正式内容:
1、 typedef---声明,简称 typedef,为现有类型创建一个新的名字。比如人们常常使用 typedef 来编写更美观和可读的代码。所谓美观,意指 typedef 能隐藏笨拙的语法构造以及平台相关的数据类型,从而增强可移植性和以及未来的可维护性。
基本用法:
typedef unsigned char UCHAR;
右边代替左边
使用UCHAR i语句就等同于unsigned char i;
2、函数指针的基本概念
说到函数指针,必然会提到指针函数,简单阐述,也可自行百度.
1)指针函数是指带指针的函数,即本质是一个函数。函数返回类型是某一类型的指针
类型标识符 *函数名(参数表)
int *f(x,y);/* 声明一个指针函数 */
首先它是一个函数,只不过这个函数的返回值是一个地址值。函数返回值必须用同类型的指针变量来接受,也就是说,指针函数一定有函数返回值,而且,在主调函数中,函数返回值必须赋给同类型的指针变量。
表示:
float *fun(); float *p; p = fun(a);
2)函数指针是指向函数的指针变量,他的本质是一个指针变量。
类型说明符 (*函数名)(参数)
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明必须和它指向函数的声明保持一致。
其主要的区别是一个是指针变量,一个是函数。
- 3、typedef void(*Func)(void)的由来
其实这样的形式声明函数指针是有”问题”的。如果仿照变量类型声明,声明函数指针似乎应该这样:typedef void(*)() variable;
但是c标准的创建者没有这样做,不知道为什么,而选择了这样的声明:
typedef void(*variable)();
C编译器非常清楚,这就是在声明一个void(*)() 类型的函数指针variable。
- 4、typedef void(*Func)(void)的用途
先来看下其基本用法
#include <iostream> using namespace std; typedef void (*Func)(void); void myFunc(void){ cout << "函数:myFunc."; }
Func pFun = myFunc;/*赋值*/
int main() { std::cout << "Hello, World!" << std::endl; pFun();/*调用*/ }
typedef void(*Func)(void)的用途
用法的好处:
定义一个函数指针类型。
例子:
有三个类型相似或功能相似的函数:
void TASK1(void) { printf("I’m TASK1 \n"); }//函数定义 void TASK2(void) { printf("I’m TASK2 \n"); }//函数定义 void TASK3(void) { printf("I’m TASK3 \n"); }//函数定义 typedef void (*Func)(void);//声明
至此,我们就已经构造好了通用函数
还需要定义一个调用的函数
void gTASK(char i) { // Func vTask[3] = {&TASK1, &TASK2, &TASK3}; Func vTask[3] = {TASK1, TASK2, TASK3}; Func fun = vTask[i]; fun(); } void gTASK2(char i) { // Func vTask[3] = {&TASK1, &TASK2, &TASK3}; Func vTask[3] = {&TASK1, &TASK2, &TASK3}; Func fun = vTask[i]; (*fun)(); }
使用gTASK来执行:
执行gTASK(1)会打印出 I’m TASK1
执行gTASK(2) 会打印出I’m TASK2
执行gTASK(3) 会打印出I’m TASK3
PS:typdef void (*func)(void);还有很多好的用处,操作系统源码都用的很巧妙,有空我总结出来,再分享。
int main() { std::cout << "Hello, World!" << std::endl; //pFun();/*调用*/ gTASK(2); gTASK2(1); return 0; }
参考:https://blog.csdn.net/Big_KingWang/article/details/50527790 本文有巨大改动,且代码运行测试过了。
下面文为:https://blog.csdn.net/zyboy2000/article/details/4202349
写的也不错,可以很好的补充上面的文,不同的讲解方式。
(*(void(*)())0) () 等同 ((void(*)())0) () ----原因函数是一种function-to-pointer的方式,&fun, fun, *fun ,**fun都是一样
硬件地址跳到0处
(*(void(*)())0) ();
预备知识
float (*h)();
表示h是一个指向返回值float类型的函数的指针
(float(*)())
表示一个"指向返回值float类型的函数的指针"的类型转换符
假设fp是一个函数指针,那么如何调用fp所指向的函数,调用方法如下:
(*fp)();
按照人们的惯性思维,那么我们可以这样写
(*0)();
上式不能生效,因为运算符*必须要一个指针来做操作数,而且这个指针还必须是个函数指针。所以我们必须要把0强制转换成一个函数指针(指向返回值为void类型的函数的指针)
假设fp是个float指针,声明如下
float * fp;
把0强制转换成一个float指针(把变量fp去掉就可以了)
(float *)0;
类似:
假设fp是函数指针为void类型的函数的指针),声明如下:
void (*fp)();
把0强制转换成该函数指针(变量fp去掉就可以了)
(void(*)())0
最后用(void(*)())0代替fp,从而得到调用的用法
(*(void(*)())0) ();
可用typedef简化函数指针
例如:
typedef char * string;
string test="hello";
类似
typedef void(*func)(); //这样func就表示一个函数指针的类型
(*(func)0)();
例子
方法一:
typedef void (*pfunction)(void);
void FMI_Jump(void)
{
pfunction jump;
jump=(pfunction)(0x80000);
jump();
}
方法二:
((void(code *)(void))0xF400)();
=
=
=
相关推荐
数据结构:栈子系统全文共8页,当前为第1页。数据结构:栈子系统全文共8页,当前为第1页。...* 请选择菜单号(0--5): */ #include <stdio.h> #include <stdlib.h> #define STACKMAX 50 typedef struct sta
* * 3------广度优先遍历 * * * 0------ 返 回 * * *********************************** * 请选择菜单号(0--3): */ #include <stdio.h> #include <stdlib.h> #define GRAPHMAX 30 #define QUEUEMAX 30 typedef ...
/* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ /* Private macro ---------------------...
typedef void (*CustomFreeLibraryFunc)(HCUSTOMMODULE, void *); /** * Load DLL from memory location. * * All dependencies are resolved using default LoadLibrary/GetProcAddress * calls through the ...
/* Private typedef -----------------------------------------------------------*/ /* Private define ------------------------------------------------------------*/ #ifdef USE_STM3210B_EVAL #define ...
淘宝上卖的16路PWM舵机驱动模块的51单片机程序 部分程序如下 #include <reg52.h> #include <intrins.h> #include #include typedef unsigned char .../*------------------------------------------------------...
51单片机 驱动16路模块 PWM/ 舵机驱动板 控制器 机器人 IIC PCA9685 部分程序如下 #include <reg52.h> #include <intrins.h> #include #include .../*-------------------------------------------...
2 void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_Pin_TypeDef GPIO_Pin, GPIO_Mode_TypeDef GPIO_Mode); 3 void GPIO_Write(GPIO_TypeDef* GPIOx, u8 PortVal); 4 void GPIO_WriteHigh(GPIO_TypeDef* GPIOx, GPIO_Pin_...
typedef的用法 typedef 是 C 和 C++ 语言中的一个关键字,用于为数据类型定义一个新的名称。这可以使得代码更加简洁和可读。通过使用 typedef,我们可以为基本数据类型、结构体、联合体等定义别名,这样在后续的代码...
typedef enum { NUL, IDENT, NUMBER, PLUS, MINUS, TIMES, SLASH, ODDSYM, EQL, NEQ, LSS, LEQ, GTR, GEQ, LPAREN, RPAREN, COMMA, SEMICOLON, PERIOD, BECOMES, BEGINSYM, ENDSYM, IFSYM, THENSYM, ...
typedef struct { unsigned long esk[32]; /*!*/ unsigned long dsk[32]; /*!*/ } des_context; /** * \brief Triple-DES context structure */ typedef struct { unsigned long esk[96]; /*!< Triple-DES ...
typedef void * (*func)(); func f = reinterpret_cast <func>(lib.get_func( " factory " )); lib.close_lib(); C例 // dlib_handle is defined in the header file dlib_handle handle = load_lib( " ./libwidget1...
/*------------------------------------------------------------------*/ /* --- STC MCU International Limited -------------------------------*/ /* --- STC 1T Series MCU SPI Demo(1 master and 1 slave) --...
使用VS2012 编写 DLL封装函数PE结构的操作 win32 控制台程序调用并显示 函数原型 typedef PIMAGE_SECTION_HEADER (*GetSectionHead) (PIMAGE_NT_HEADERS NtHead); typedef PIMAGE_IMPORT_DESCRIPTOR (*GetImportHead...
glad4.0.zip
typedef struct Element { struct Element *next; void *data; } Element; bool push( Element **stack, void *data); bool pop( Element **stack, void **data); bool createStack(Element **stack); bool ...
typedef void (__cdecl *_se_translator_function)(unsigned int, struct _EXCEPTION_POINTERS*); #endif #if _MSC_VER >= 1200 _CRTIMP __declspec(noreturn) void __cdecl terminate(void); _CRTIMP __declspec...
typedef void (*iconv_unicode_char_hook) (unsigned int uc, void* data); /* Hook performed after every successful conversion of a wide character. */ typedef void (*iconv_wide_char_hook) (wchar_t wc, ...
/*----------------定义边信息--------------*/ typedef struct node { int adress; // 记录节点位子 struct node *next; //指向下一条边的指针 } edgenode; /*-------------节点元素---定义类型--------------*/...
void InitHuffmanTree(int a[],char b[],int &n,int &q) { int i; q=0; cout请输入叶子结点的个数:"; cin>>n; cout请按照字符 空格-.->A-...->Z的顺序输入"; cout(以@表示空格字符,下同!)"; cout请输入...