C/C++系列——函数声明全解析
2016-11-29 22:26
281 查看
一. 函数是什么
函数,从代码层面(逻辑上)来讲,就是一个功能模块,集成了若干程序语句;从运行时(硬件物理上)来讲,就包括了一个内存代码块和一个内存堆栈。程序员所实现的每个程序系统中往往包含了大量的函数,各个函数之间存在着直接或者间接的调用关系。我们知道,要想调用一个函数,就需要知道一个函数的声明情况(包括,函数名,返回类型,参数列表等),从系统层面看,就需要知道函数的入口地址。给一个函数分配入口地址是由编译器来完成的,这一过程对于程序员来说是透明的。而程序员所接触到的就是仅仅是函数名。从这个角度看,函数名就是一个指针:我们可以通过对一个函数名进行解除引用从而指向对应的函数入口地址。
二. 理解函数声明
先弄清楚一个问题:函数指针 vs 指针函数?
函数指针:顾名思义,函数是“修饰”,指针是本质。函数指针就是一个指针,这个指针指向函数的地址。形如,void (*fp)(int),fp就是一个函数指针。
值得注意的是:调用fp所指向的函数,可以采用一般的指针解除引用的方法,形如,*fp(2)。或者采用直接调用函数的方法,形如,fp(2)。另外,对于函数的调用,不管是传统的函数名,还是函数指针,这两种调用方法都是可以的。
指针函数:类似地,指针是“修饰”,函数是本质。指针函数就是一个函数,其返回值类型是一个指针类型。形如,void *func(int),func就是一个指针函数。
然后我们再来看一个例子:
例1.1
为了读懂上述函数声明,我们采用分块的方式来阅读。首先,将void (*signal(int, void(*)(int)))(int)中绿色部分用简单字符串func替换,于是,复杂的语句就变成了void (*func)(int)。这样我们就可以看出func就是一个函数指针,其返回值为void,参数列表为一个int类型:也说明了这实际上就是signal的返回类型。再进一步分析绿色部分的语句signal(int,
void(*)(int)),signal的参数列表为一个int类型和一个函数指针(其返回类型为void,参数为一个int类型)。
例1.2
综上,例1.1和例1.2的语义是相同的,只是利用了typedef的类型声明功能后,函数声明变得更加清楚易懂。他们的作用都是声明了一个名为signal,返回类型为一个(返回值为void,参数为int的)函数指针,参数为一个int类型和一个(返回值为void,参数为int的)函数指针。
函数,从代码层面(逻辑上)来讲,就是一个功能模块,集成了若干程序语句;从运行时(硬件物理上)来讲,就包括了一个内存代码块和一个内存堆栈。程序员所实现的每个程序系统中往往包含了大量的函数,各个函数之间存在着直接或者间接的调用关系。我们知道,要想调用一个函数,就需要知道一个函数的声明情况(包括,函数名,返回类型,参数列表等),从系统层面看,就需要知道函数的入口地址。给一个函数分配入口地址是由编译器来完成的,这一过程对于程序员来说是透明的。而程序员所接触到的就是仅仅是函数名。从这个角度看,函数名就是一个指针:我们可以通过对一个函数名进行解除引用从而指向对应的函数入口地址。
二. 理解函数声明
先弄清楚一个问题:函数指针 vs 指针函数?
函数指针:顾名思义,函数是“修饰”,指针是本质。函数指针就是一个指针,这个指针指向函数的地址。形如,void (*fp)(int),fp就是一个函数指针。
值得注意的是:调用fp所指向的函数,可以采用一般的指针解除引用的方法,形如,*fp(2)。或者采用直接调用函数的方法,形如,fp(2)。另外,对于函数的调用,不管是传统的函数名,还是函数指针,这两种调用方法都是可以的。
指针函数:类似地,指针是“修饰”,函数是本质。指针函数就是一个函数,其返回值类型是一个指针类型。形如,void *func(int),func就是一个指针函数。
然后我们再来看一个例子:
例1.1
void (*signal(int, void(*)(int)))(int);
为了读懂上述函数声明,我们采用分块的方式来阅读。首先,将void (*signal(int, void(*)(int)))(int)中绿色部分用简单字符串func替换,于是,复杂的语句就变成了void (*func)(int)。这样我们就可以看出func就是一个函数指针,其返回值为void,参数列表为一个int类型:也说明了这实际上就是signal的返回类型。再进一步分析绿色部分的语句signal(int,
void(*)(int)),signal的参数列表为一个int类型和一个函数指针(其返回类型为void,参数为一个int类型)。
例1.2
typedef void (*func)(int); func signal(int, func);typedef的作用是声明一种类型,所以这个语句就产生了一种新的类型:一个名为func的,返回值为void,参数为一个int类型的函数指针。紧接着下一语句是函数signal的声明,其返回类型为func,参数为一个int类型和一个func类型。
综上,例1.1和例1.2的语义是相同的,只是利用了typedef的类型声明功能后,函数声明变得更加清楚易懂。他们的作用都是声明了一个名为signal,返回类型为一个(返回值为void,参数为int的)函数指针,参数为一个int类型和一个(返回值为void,参数为int的)函数指针。
相关文章推荐
- [C++再学习系列] 函数声明与STL容器构造
- C++中函数的定义和声明深度解析
- [C++再学习系列] 函数声明与STL容器构造
- C/C++开发语言系列之25---不能声明为虚函数的函数
- 40、不一样的C++系列--函数异常声明
- C/C++笔试系列--默认参数在哪指定?函数声明还是定义?
- C++强制转换不同声明或类型的函数指针隐患
- Effective C++摘要《第4章:类和函数:设计与声明》20090209
- 在C中用struct实现C++中class的函数声明和定义
- 上传 qnx 6.32专业版帮助 unix linux命令及c c++函数解析 类linux的msdn
- C++不足之处讨论系列(四)--函数重载
- [C++再学习系列] 派生类函数的重实现规则(override-覆盖)
- std空间声明的具体地方 和 标准C++有时间函数吗?
- c++声明/定义,静态/非静态,变量/函数
- [C++再学习系列] C++编译器的函数编译流程
- [C++再学习系列] Using声明和指令的工作原理
- 玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest
- 使用Delphi声明C++带函数的结构体实战
- C++什么时候析构函数需要声明为虚函数
- C/C++笔试系列--经典C++笔试题解析1