c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind |
您所在的位置:网站首页 › t开头的袜子 › c++11 符号修饰与函数签名、函数指针、匿名函数、仿函数、std::function与std::bind |
一、符号修饰与函数签名
1、符号修饰 编译器将c++源代码编译成目标文件时,用函数签名的信息对函数名进行改编,形成修饰名。GCC的C++符号修饰方法如下: 1)所有符号都以_z开头 2)名字空间的名字 名字空间(或类)的名字前加上N 名字前还有一个数字,是名字的字符数。比如1C,1是C的长度。 3)函数名 与名字空间一样,函数名前也有数字,比如4func,4是func的字符数。 4)参数 参数以E开头 例子 N::C::func(int) 的函数签名经过修饰为_ZN1N1C4funcEi 2、函数签名 函数签名组成部分:包括函数名,参数类型,参数个数和顺序,以及它所在类和命名空间。 以上任何一个部分的不同,都会导致符号修饰后的名词不同,即导致函数签名不同,故可以区分不同的函数,在调用的时候就不会出错。 二、函数指针例子: int(*p)(int,int) 语句定义了一个指向函数的指针变量P,这个函数指针可以指向这么一个函数,即返回值为int类型,且有两个int参数的函数,指针p的类型为int(*)(int,int)。 函数指针的统一定义方式为: 函数返回类型(* 指针变量名)(函数参数列表) 简单用法: int func(int x); //定义一个函数 int (*p)(int x); //定义一个函数指针 p=func; //将函数func的首地址赋值给指针变量p 三、c++11中的匿名函数(lambda函数,lambda表达式) C++11提供了对匿名函数的支持,称为lambda函数(也成为lambda表达式),形式如下 [capture](parameters)->return-type{body} 解析: capture 1)、[] //未定义变量,试图在lambda函数内使用任何外部变量都是错误的 2)、[x,&y] //x按值捕获,y按引用捕获 3)、[&] //用到的任何外部变量都隐式按引用捕获 4)、[=] //用到的任何外部变量都隐式按值捕获 5)、[&,x] //x显式按值捕获,其他变量按照引用捕获 6)、[=,&z] //z按引用捕获,其他变量按值捕获 parameters:存储函数的参数,当parameters为空的时候,()可以省去 return-type:函数的返回值,如果funtion body中存在return语句,则该lambda表达式的返回类型由return语句的返回类型确定。 body:函数体 例子: auto fun=[](int x){ return x; } cout |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |