STL函数static void (* set_malloc_handler(void (*f)()))()与函数指针解析
在C++ STL的SGI实现版本中,一级空间配置器class __malloc_alloc_template中有一个静态函数的实现如下:
static void (*set_malloc_handler(void (*f)()))() {
void (*old)() = __malloc_alloc_oom_handler;
__malloc_alloc_oom_handler = f;
return (old);
}
没接触过函数指针的人看到这段代码可能会很头疼,不知道这个函数表达什么意思。
其实我们应该由内向外读这段代码的首部:
void (*set_malloc_handler(void (*f)()))()
当我们看到set_malloc_handler有函数调用运算符和参数:(void (*f)()),说明这是个函数,以一个void (*)()类型的函数指针f做为参数(即f是一个函数指针,指向的函数为空参数列表,无返回值),set_malloc_handler前面有一个*,所以这个函数应该返回一个指针,然后指针本身也有空参数列表(),因此该指针指向函数,该函数的返回值也是void,参数列表也为空。
综合起来说,就是我们定义了一个函数set_malloc_handler,它接受一个void (*)()类型的参数f,返回类型为void (*)()。
利用C++11的尾置返回类型表达式函数首部可以写成这样:
auto set_malloc_handler(void (*f)()) -> void (*)()
其中参数类型和返回类型都是void (*)()
其实,我们为了阅读方便,可以改变一下写法,在C++中,我们可以这样写:
typedef void (*PF)(); //我们定义一个函数指针类型PF代表void (*)()类型
static PF set_malloc_handler(PF f) {
PF old = __malloc_alloc_oom_handler;
__malloc_alloc_oom_handler = f;
return (old);
}
这样看起来就比较通俗易懂了。
在C++11新标准中我们也可以把以上typedef类型定义改成using表达式:
using PF = void (*)();
PS:不懂函数指针的可以参考《C++ Primer(第五版)》6.7节
STL函数static void (* set_malloc_handler(void (*f)()))()与函数指针解析的更多相关文章
- python之函数名称空间,作用域,嵌套函数
目录 嵌套函数 定义 名称空间的三大类(只存变量名) 名称空间加载顺序 变量名的查找顺序为 作用域 嵌套函数 定义 函数内部定义的函数,无法在函数外部使用内部定义的函数. def f1(): def ...
- 简述static关键字、void与void *(void指针)、函数指针
static关键字1.修饰局部变量,延长局部变量的生命周期.使变量成为静态局部变量,在编译时就为变量分配内存,直到程序退出才释放存储单元.2.修饰全局变量,限制全局变量的使用范围为本文件中.全局变量默 ...
- signal函数的原型声明void (*signal(int signo, void (*fun(int))))(int)分析
转:http://blog.sina.com.cn/s/blog_4850a7880100hnam.html void (*signal(int signo, void (*fun(int))))(i ...
- 把C程序的int main(void)改成static int main(void)会怎样呢?
如题,把C程序中的主函数int main(void)改成static int main(void)会怎么样呢? 比如把 #include <stdio.h> int main(void) ...
- c++11 类默认函数的控制:"=default" 和 "=delete"函数 void fun() = default; void fun()=delete;
转自:lsgxeva #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...
- typedef void(*Fun) (void)是什么意思 函数指针(回调函数) 和函数对象总结
https://blog.csdn.net/FreeApe/article/details/49124043 bool (*pf)(const string &,const string &a ...
- void * 和 void 在函数返回值中的区别
一个很容易糊涂的问题. 在函数的返回值中, void 是没有任何返回值, 而 void * 是返回任意类型的值的指针. 还是看代码吧: #include <stdlib.h> #inclu ...
- 某些情况下调用函数为什么要在函数名前加“(void)”
我们知道,在定义函数时,加在函数名前的"void"表示该函数没有返回值.但在调用时,在函数名前加"(void)"的作用又是什么呢? 最明显的一点就是表示程序并不 ...
- typdef void(*fun)(void)笔记【函数指针/typdef函数指针】
1. 函数指针:返回类型(*函数名)(参数表) 2. 使用typdef void(*fun)(void) typedef的功能是定义新的类型.第一句就是定义了一个MyFun的类型,并定义这种类型为 指 ...
随机推荐
- Winform中GridView分组排序实现功能
由于客户最近要扩充公司的业务,之前基于Winform+web开发混合式的系统已经不能满足他们的需求,需要从新对系统进行分区处理. 考虑到系统模块里面用到的GridView视图比较多,我就结合了DevE ...
- 【16.05%】【codeforces 664B】Rebus
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- win10 uwp 线程池
原文:win10 uwp 线程池 如果大家有开发 WPF 或以前的程序,大概知道线程池不是 UWP 创造的,实际上在很多技术都用到线程池. 为什么需要线程池,他是什么?如何在 UWP 使用线程池,本文 ...
- Objective-C 数据类型 (一)
数据类型分为三类:基本数据类型,对象类型,id类型. 基本数据类型:int ,float double char 对象类型:类,指针对象,协议 id类型:可以表示对象类型(在表示对象类型的时候 不需要 ...
- 将memo转化为JPG输出,使用Memo1.PaintTo(Bitmap.Canvas)
unit unit1; interface uses Windows, Messages, SysUtils, Graphics, Controls, Forms, StdCtrls, Class ...
- Application中数据传递及内存泄漏问题
原文地址:http://android.tgbus.com/Android/tutorial/201107/359474.shtml Application的使用 Application和Actovo ...
- java 子类重写父类的方法
若想实现一个合格重写方法,而不是重载,那么必须同时满足下面的要求! A.重写规则之一:重写方法不能比被重写方法限制有更严格的访问级别. (但是可以更广泛,比如父类方法是包访问权限,子类的重写方法是pu ...
- Erlang实现进程池
开发工作中,经常会碰到进程池或者线程池,或者其它的资源池.在这里,用erlang实现一个简单的进程池. erlang进程是非常轻量级的,这个进程池的主要目的是用一种通用的方式去管理和限制系统中运行的资 ...
- 解决关于archlinux升级至3.16.1,Xorg桌面环境无法进入的问题
[现象]有终端输入username,password后,桌面环境启动失败. [报错]log文件里显示: (EE) Fatal server error: (EE) xf86OpenConsole: V ...
- 自定义Behavior 实现Listbox自动滚动到选中项
原文:自定义Behavior 实现Listbox自动滚动到选中项 blend为我们提供方便的behavior来扩展我们的控件,写好之后就可以在blend中方便的使用了. 下面是自定义的behavior ...