`
fantaxy025025
  • 浏览: 1327974 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

【cpp】typedef void(*Func)(void) 用法讲解-经典讲解

 
阅读更多

=

 

语言的进化需要n多年,尤其是it已经成熟了,积累下来的代码量大而后续替换的动力不足。

因此,新型的书写规范且设计良好的语言,替换掉历史,需要更长时间。

 

新生事物的成本总是最低的。

 

正确的声明方式为:

typedef void(*)()  variable;

但是c标准的创建者没有这样做,不知道为什么,而选择了这样的声明:

typedef void(*variable)();

C编译器非常清楚,这就是在声明一个void(*)() 类型的函数指针variable

=

本文希望解决以下问题:

1typedef 的基本概念

2、函数指针的基本概念

3typedef void(*Func)(void)的由来

4typedef 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 */

其实这里不能称为函数名,应该叫做指针的变量名。这个特殊的指针指向一个返回整型值的函数。指针的声明必须和它指向函数的声明保持一致。

其主要的区别是一个是指针变量,一个是函数。

 

  • 3typedef void(*Func)(void)的由来

 

其实这样的形式声明函数指针是有”问题”的。如果仿照变量类型声明,声明函数指针似乎应该这样:typedef void(*)()  variable;

但是c标准的创建者没有这样做,不知道为什么,而选择了这样的声明:

typedef void(*variable)();

C编译器非常清楚,这就是在声明一个void(*)() 类型的函数指针variable

 

 

  • 4typedef 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)();

 

 

 

=

=

=

 

分享到:
评论

相关推荐

    c++的学习之路:4、入门(3)

    void func(int a, int b = 10) { /* ... */ } // b有一个默认值10 ``` 3. **函数重载**: - 函数可以在同一作用域内有相同的名称,但参数列表必须不同。 - 参数的不同可以体现在类型、数量或顺序上。 - 示例:...

    C#特点介绍C#特点介绍

    typedef void (__stdcall* func_type)(char* callBackJsonStr); ``` - **声明外部调用方法**:在 C# 中声明一个可以被 C++ 代码调用的方法: ```csharp [DllImport("YourCppLibrary.dll", CallingConvention ...

    VC++完美界面换肤方法

    typedef int(__stdcall* FUNC)(PCHAR); void CSkinTestDlg::InitSkin() { CHAR szName[MAX_PATH]; CString strName = GetAppPath() + TEXT("skins\\LE4-DEFAULT.skn"); FUNC pFunc = (FUNC)GetProcAddress...

    CC++笔试题系列

    void show(FUNC2 fun, int arg1, int *arg2) { INC p = &inc; int temp = p(arg1); fun(&temp, &arg1, arg2); printf("%d\n", *arg2); } main() { int a; show(multi, 10, &a); return 0; } ``` - **解析:*...

    深入C++ typedef的用法总结(必看)

    在C++编程语言中,`typedef` 是一个非常实用的工具,它允许程序员为已存在的类型创建新的名字或别名。下面将详细解释`typedef`的四种主要用途,并通过实例来帮助理解其功能。 用途一:定义类型别名 `typedef` 可以...

    如何将Matlab7.0函数转换成VC++6.0动态链接库.doc

    typedef void (*SUM_PROD_FUNC)(double, double, double*, double*); SUM_PROD_FUNC sum_prod_func = (SUM_PROD_FUNC)GetProcAddress(hLib, "sum_prod"); if (sum_prod_func != NULL) { double sum, prod; sum...

    2009福富笔试题(java,cc)海外,电信.doc

    typedef void (*FUNC)(); ``` - 这里定义了一个名为`FUNC`的类型,它指向一个无参数且返回类型为`void`的函数。 #### 虚函数与静态成员 - **虚函数**: - 可以被继承,并在派生类中重写,主要用于实现多态。 - ...

    Function_Pointers

    ### 函数指针(Function Pointers) #### 一、引言 函数指针是C语言及其衍生语言(如C++)中的一个强大...通过深入了解函数指针的使用方法,开发人员可以在实际项目中更好地利用这一特性,构建出更加高效、优雅的程序。

    C++函数指针

    本文将详细介绍函数指针的基本概念、定义方式、使用方法及其在实际编程中的应用场景。 #### 二、基本概念 ##### 1. 定义与理解 函数也是一种特殊的“对象”,它有自己的地址。函数指针就是用来存储这些地址的一种...

    C++复习提纲之一:重点与难点

    - 使用方法:通过`#include`命令引入。 - **程序中两种注释标记的写法和作用**: - 单行注释:`// 这是单行注释` - 多行注释:`/* 这是多行注释 */` - **标准输入输出流对象**: - `cout`用于输出,如`cout ;`...

    The Annotated C++ Reference Manual(ARM)-Ch07

    void func() { static int count = 0; ++count; cout ; } ``` - **外部变量** (`extern`):声明了一个在其他文件中定义的变量。 ```cpp extern int globalVar; ``` #### 5. 类型别名与typedef - **类型...

    C++与操作系统等面试题69

    typedef void (*CallbackFunc)(int); // 定义回调函数 void callback(int x) { std::cout ; } // 触发回调函数 void trigger(CallbackFunc cb, int value) { cb(value); } int main() { CallbackFunc func_ptr...

    基于gmock实现的cppmockfree的使用方法总结

    ### 基于gmock实现的cppmockfree的使用方法总结 #### 1. 引言 在进行C++单元测试的过程中,我们经常会遇到需要模拟(mock)某些函数的情况,以便于隔离测试对象与外部环境的依赖关系。Google Mock(简称gmock)是...

    Poco SharedLibrary

    typedef void (*HelloFunc)(); int main(int argc, char** argv) { std::string path("TestLibrary"); path.append(SharedLibrary::suffix()); // 添加后缀名(如.dll或.so) SharedLibrary library(path); // ...

    彻彻底底搞定C/C++指针

    除了上述方法外,还可以使用`funcPtr(5, 3)`的形式来调用函数。 5. **定义某一函数的指针类型** 可以定义一个函数指针类型,然后根据需要创建多个指向该类型的变量。例如: ```cpp typedef int FuncPtrType...

    C++常用的编程关键字.md

    void func() { std::cout ; } } ``` ##### 18. `return` - **用途**:用于从函数中返回一个值。 - **示例**: ```cpp int add(int a, int b) { return a + b; } ``` ##### 19. `short` - **用途**:声明...

    在C++中调用Fortran Imsl库的通用方法.rar

    typedef void (*FortranFunction)(void*); int main() { void* libHandle = dlopen("libfortran_library.so", RTLD_LAZY); if (!libHandle) { // 错误处理... } FortranFunction func = (FortranFunction)...

    C++中this指针的用法

    ### C++中this指针的深入理解与应用 #### 一、this指针的基本概念 在C++中,`this`指针是一个非常重要的概念,它仅能在类的成员函数中使用,...掌握`this`指针的使用方法可以帮助开发者更好地理解和利用C++类的特性。

    c++builder回调函数例子

    typedef void (*CallbackFunction)(int data); ``` 这里定义了一个名为`CallbackFunction`的函数指针类型,它接受一个`int`参数并返回`void`。 2. **实现回调函数**:在主程序中,我们需要实现这个函数,这是DLL...

    C++ dlopen mini HOWTO

    typedef void (*MyFunc)(); MyFunc func = (MyFunc)dlsym(handle, "some_function"); if (dlerror()) { fprintf(stderr, "%s\n", dlerror()); return 1; } func(); dlclose(handle); ``` - **类的动态...

Global site tag (gtag.js) - Google Analytics