C++动态联编-函数指针

原创 2013年12月05日 20:58:29
在C++编译时,对于常规的函数调用,编译器在函数的调用出插入函数的相对地址,程序运行时可以有函数的相对地址计算出函数的绝对地址,这样函数可以被正确调用。这种在编译时就确定函数地址的联编过程叫做静态联编。动态联编是指在程序编译时,编译器并不知道函数的相对地址,调用函数的相对地址只有在程序运行时才能确定。例如在如下示例中的DisplayNumber()函数体内,编译器并不知道DisplayFormat(Number)调用的函数地址,真正的地址是在运行时通过实参传入的。




//示例2.1中定义了一个通用函数:void DisplayNumber(DISPLAYINTEGER DisplayFormat,const int Number)
//其功能是以各种格式显示整形数字。只要传递适当的实参,该函数就能很好工作。
//如果客户需求发生变化,例如增加二进制格式的输出,只要增加相应的功能函数。
// void DisplayBinary(const int Number)即可。通用函数不必改动。
//显然,函数指针DISPLAYINTEGER给该函数增添了灵活性,得以通用。
//这得益于C++的动态联编功能,而函数指针不过是该功能的一种应用形式。


#include "stdio.h"
#include "stdlib.h"

//定义函数指针类型DISPLAYINTEGER,只想返回值为void,参数列表为(const int)的函数
typedef void (*DISPLAYINTEGER)(const INT);

//定义函数,将数字以十进制形式输出,该函数类型与DISPLAYINTEGER匹配
void DisplayDecimal(const int Number)
{
     printf("The decimal value is %d\n",Number);
}
//定义函数,将数字以八进制形式输出,该函数类型与DISPLAYINTEGER匹配
void DisplayOctal(const int Number)
{
     printf("The octal value is %o\n",Number);
}
//定义函数,将数字以十六进制形式输出,该函数类型与DISPLAYINTTEGER匹配
void DisplayHexadecimal(const int Number)
{
     printf("The hexadecimal value is %x\n",Number);
}
/************************************************************************************
定义通用的显示数字函数        
DisplayFormat           DISPLAYINTEGER函数指针类型,实参可以是以上定义的
                        3个函数之一。通过传递不同的实参,将数字以各种格式输出
Number                  准备输出的数字
************************************************************************************/
     void DisplayNumber(DISPLAYINTEGER DisplayFormat,const int Number)
     {
          //调用以实参传入的函数,以某种格式输出整形数字
          DisplayFormat(Number);
     }

int main(int argc,char* argv[])
{
     int Number=0;

     //如果有数字形式的命令行参数,将其输出,否则输出0
     if(argc>1)
        Number=atoi(argv[1]);
     //分别以3种格式将数字输出
     DisplayNumber(DisplayDecimal,Number);
     DisplayNumber(DisplayOctal,Number);
     DisplayNumber(DisplayHexadecimal,Number);

     return 0;
}


命令行
vitual.exe 50
的输出结果:
The decimal value is 50
The octal value is 62
The hexadecimal value is 32

相关文章推荐

C/C++高阶语法:函数指针及其应用,动态链接库,正向调用

1、在介绍正向调用之前,先讲一讲动态链接库的知识:       1)、 动态链接库 DLL,即Dynamic Link Library,在理解动态链接库的时候,我们可以把它理解为一个包含变量,函数或...

函数指针,动态链接库

  • 2015年11月03日 16:23
  • 21.47MB
  • 下载

[C++_2]结构及函数指针&重载&内联

2 结构指针(意义?) 通过成员指针(相对地址)访问结构成员: 结构变量.*成员指针 结构指针->*成员指针 #include #include enum gender{F,M}; using na...

c++ 成员函数指针

  • 2010年04月11日 11:39
  • 9KB
  • 下载

C++中函数指针的含义

  • 2008年11月05日 14:11
  • 38KB
  • 下载

关于用函数指针参数申请动态内存的问题

今天在写一个Binary Search Tree的程序时,发现其插入有问题,下面是插入程序,每次插入完成后,节点还是NULL。 template void CMyTree::insert(co...

C++day16-函数指针-模版

  • 2015年10月28日 23:35
  • 10.82MB
  • 下载

委托,事件,动态代理,函数指针

委托,事件,动态代理,函数指针
  • Rogues
  • Rogues
  • 2011年04月01日 17:31
  • 718

C++函数指针学习

  • 2011年12月09日 18:31
  • 334KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++动态联编-函数指针
举报原因:
原因补充:

(最多只允许输入30个字)